Forum: Mikrocontroller und Digitale Elektronik if abfrage von übergebenen string


von S. F. (deffman)


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ß

von Jan M. (mueschel)


Lesenswert?

Wenn du strings vergleichen willst -> strcmp() und Konsorten verwenden.
Wenn du auf einen Buchstaben ueberpruefen willst -> einfache 
Anfuehrungszeichen verwenden

von Johannes M. (johnny-m)


Lesenswert?

"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 ...

von S. F. (deffman)


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

von Stefan E. (sternst)


Lesenswert?

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)

von lkmiller (Gast)


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;
}

von DEtlef (Gast)


Lesenswert?

oder:

  if(PortName[0] == 'A')
    pio = &AVR32_PIOA;
  else if (PortName[0] == 'B')
    pio = &AVR32_PIOB;

würde ich meinen.

von S. F. (deffman)


Lesenswert?

Ah okay, eigentlich logisch!

Danke vielmals!!!!

Gruß Stefan

von lkmiller (Gast)


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.

von Johnny (Gast)


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;
}

von S. F. (deffman)


Lesenswert?

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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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
Noch kein Account? Hier anmelden.