If-Anweisung

Gast #6362
hi,

Das Müsste doch stimmen:

if(UARTChecksum==bTemp)
   UARTRec=UART_OK;   //Hier soll ein Fehler sein
else
   UARTRec=UART_ERROR;

doch da kommt folgender Fehler:

"Prase Error before else" in der 2. Zeile

Wenn ich nun das schreibe:

if(UARTChecksum==bTemp)
{   UARTRec=UART_OK; }
else
   UARTRec=UART_ERROR;

ist der Fehler weg.

Kann ich nicht wenn nur ein Befehl in einer if-anweisung ist die {} 
weglassen. Bei "while" gehts und bei "If" eigenlich auch immer. warum da 
nicht??

lg,

Stefan
Gast
Hast du vielleicht in dem #define, das für UART_OK zuständig ist, einen 
syntaktischen Fehler gemacht? Evtl. ein Semikolon dahintergesetzt?

Schmittchen.
Gast
Kann es sein, daß es so:

if(UARTChecksum==bTemp)
   UARTRec=UART_OK
else
   UARTRec=UART_ERROR;


sein muß?

Ich kann mich dunkel daran erinnern, daß ich irgendwann bei einem 
Compiler (keiner Ahnung welcher) das Problem hatte, dass das Semikolon 
vor der else nicht sein durfte, wenn es nur eine Zeile zwischen if und 
else war.
bin mir nicht sicher, ist nur eine Vermutung.
Gast
@BAB: hm, vielleicht hast du recht (hab grad keine Möglichkeit zum 
Testen). Ich vermute aber eher folgendes:

Angenommen Stefan hat UART_OK so definiert (er verräts ja nicht):
#define UART_OK  0;
dann hätte er im ersten Falle 2 Strichpunkte hintereinander, der erste 
zu Recht, der zweite wird als "Leerbefehl" (kann man so sagen?) 
interpretiert und "ignoriert". Durch die umschliessenden Klammern wird 
daraus eine Einheit. Ohne die Klammern werden daraus ja 2 Befehle, auf 
die dann das else folgt -> Fehler.

Zumal Stefans 2.Posting diese Vermutung bestätigt.

Schmittchen. "Ich muss weg".
Gast
@Schmittchen
Ich vermute, du hast Recht.

@AndreasH
Wenn ein C-Compiler tatsächlich diesen schwerwiegenden Fehler in der 
Umsetzung der Standardbefehle aufweist, dann gehört dieser Compiler 
eindeutig in die Schrittpresse :-(

@Stefan
Es wäre sicherlich hilfreich, wenn du jeweils die verwendeten defines 
auch angeben würdest.
Grundsätzlich müssen die geschweiften Klammern immer dann angegeben 
werden, wenn nach einer Einscheidung, egal ob if, for, while oder was 
auch immer, mehr als eine einzelne Anweisung, also ein sogenannter 
Block, ausgeführt werden soll. Zwei Strichpunkte hintereinander erzeugen 
eine leere Anweisung, welche zwar vom Compiler toleriert wird, aber 
sicherlich nicht beabsichtigt ist.

Gruss
Christian
Gast
Hi,

Es Tut mir leid, aber habe nicht drann gedacht, daß es mit den defines 
was zu tun haben könnte. Natürlich hatte ich:

#define UART_OK      0x00;
#define UART_ERROR    0xFF;
#define UART_CHECKED    0x01;

ohne Semikolon ists dann sofort gegangen. Ich bin wiedermal voll am 
schlauch gestanden.

Vielen Dank für eure Hilfe.

Frohe Weihnachten

Stefan

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 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.