Hi zusammen, ich habe ein Anfänger problem und wäre nett wenn ihr mir kurz helfen könntet. Hab zwar schon im forum gesucht aber irgendwie nix passendes gefunden. Es geht um folgendes: void PIO_Output_Enable_register(char PortName[1],unsigned int value) { volatile avr32_pio_t *pio; if(PortName == "A") pio = &AVR32_PIOA; else if (PortName == "B") pio = &AVR32_PIOB; } Wenn ich der Methode jetzt zum Beispiel "A" folgermaßen übergebe: PIO_Output_Enable_register("A",2); Dann springt er in der Methode aber nicht in die entsprechende Schleife. Mein Compiler meldet mir außerdem: WARNING: comparison with string literal results in unspecified behaviour Was mache ich falsch? Danke und Gruß
Wenn du strings vergleichen willst -> strcmp() und Konsorten verwenden. Wenn du auf einen Buchstaben ueberpruefen willst -> einfache Anfuehrungszeichen verwenden
"A" ist in C ein String, und der besteht aus zwei chars, nämlich einem 'A' und einem Nullterminator '\0'. Was Du vermutlich übergeben und auswerten willst, ist nicht ein "A", sondern ein 'A'. Letzteres wäre nämlich tatsächlich das ASCII-Zeichen für A ...
Okay danke, es funktioniert jetzt mit void PIO_Output_Enable_register(char PortName[1],unsigned int value) { volatile avr32_pio_t *pio; if(PortName == 'A') pio = &AVR32_PIOA; else if (PortName == 'B') pio = &AVR32_PIOB; } und PIO_Output_Enable_register('A',2); Er springt jetzt in die if schleife, aber es kommt immer noch die Warnung: WARNING: comparison between pointer and integer Wie kriege ich das jetzt noch weg? _______________________________________________- Sorry habs geschafft mit: PIO_Output_Enable_register((char*)'A',2); Jetzt is der Fehler zumindest weg. Ist das jetzt Holzhammerart, oder passt das so? Danke
S. F. wrote:
> Wie kriege ich das jetzt noch weg?
void PIO_Output_Enable_register(char PortName[1],unsigned int value)
->
void PIO_Output_Enable_register(char PortName,unsigned int value)
'A' ist ein integer, PortName ist ein Pointer auf eine Liste bestehend aus 1 char Richtig wäre: void PIO_Output_Enable_register(char PortName, unsigned int value) { volatile avr32_pio_t *pio; if(PortName == 'A') pio = &AVR32_PIOA; else if (PortName == 'B') pio = &AVR32_PIOB; }
oder: if(PortName[0] == 'A') pio = &AVR32_PIOA; else if (PortName[0] == 'B') pio = &AVR32_PIOB; würde ich meinen.
@Detlev > if(PortName[0] == 'A') da wäre dann die Fehlermeldung/Warnung weg. Aber der übergebene Wert ist ein char 'A' >PIO_Output_Enable_register('A',2); und die empfangende Variable PortName ein Pointer auf char >void PIO_Output_Enable_register(char PortName[1],unsigned int value) Schon das passt nicht zusammen.
STOP, mach es wie Jan geschrieben hat mit strcmp()! Die Programmiersprache C kennt keine Strings im eigentlichen Sinne, wenn Du mit mit Zeichenfolgen hantierst, dann steckt da immer ein Array von Chars dahinter. Es wird also wie ein Array behandelt. Machst Du nun einen Vergleich, wird der Pointer der auf das Char Array zeigt verglichen und nicht die Zeichen, auf welche der Pointer zeigt. Mit 'A' oder so geht es natürlich wenn alles richtig deklariert ist, aber vielleicht wäre es übersichtlicher z.B. die zu übergebenden Varianten mit einem Enum zu definieren und dann diese Werte zu verwenden. Beispiel: enum MEIN_ENUM { FallA, FallB, FallC }; Dann im Code mit if (Fall == FallA) oder als Alternative mit einer switch Anweisung auswerten: switch (Fall) { case FallA: ...Code für Fall A... break; case FallB: ...Code für Fall B... break; case FallC: ...Code für Fall C... break; default: ...Code für undefinierten Fall... break; }
Okay danke hat geklappt. Musste zwar vor das Enum noch ein "typedef" aber das ist ja von compiler zu compiler verschieden. Trotzdem danke! Jetzt schaut der Code auch wenigstens anschaulich aus ;) Gruß und noch nen schönen Mittag!
> Musste zwar vor das Enum noch ein "typedef" > aber das ist ja von compiler zu compiler verschieden. Nö, ist es nicht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.