if abfrage von übergebenen string

OP #918465
Lesenswert?
• ▲
▼
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ß
OP #918486
Lesenswert?
• ▲
▼
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 #918498
Lesenswert?
• ▲
▼
'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 #918565
Lesenswert?
• ▲
▼
@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 #918595
Lesenswert?
• ▲
▼
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;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren