if abfrage von übergebenen string

OP #918465
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ß
"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 ...
OP
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
Gast
'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;
}
Gast
@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.
Gast
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;
}
OP
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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.