www.mikrocontroller.net

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


Autor: S. F. (deffman)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Jan M. (mueschel)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: S. F. (deffman)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: DEtlef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder:

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

würde ich meinen.

Autor: S. F. (deffman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah okay, eigentlich logisch!

Danke vielmals!!!!

Gruß Stefan

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: S. F. (deffman)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Musste zwar vor das Enum noch ein "typedef"
> aber das ist ja von compiler zu compiler verschieden.

Nö, ist es nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.