Forum: Compiler & IDEs If-Anweisung


von Stefan_h (Gast)


Lesenswert?

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

von Schmittchen (Gast)


Lesenswert?

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

Schmittchen.

von BAB (Gast)


Lesenswert?

dann müssten meiner meinung nach beide sachen nicht gehen...

von AndreasH (Gast)


Lesenswert?

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.

von Schmittchen (Gast)


Lesenswert?

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

von Christian Schifferle (Gast)


Lesenswert?

@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

von Stefan_h (Gast)


Lesenswert?

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

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.