PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sprungbefehl klapppt nicht



fredyxx
09.10.2017, 18:29
Hallo,

bei diesem Programmschema



void loop() {

Programmteil A

goto LOOP_END:

Programmteil B

LOOP_END:


} //************* ENDE loop



erhalte ich diese Fehlermeldung:

"expected ';' before ':' token"

Auch wenn ich das goto direkt an den anfang der LOOP setze.

Was ist da falsch, wenn ich zum Test eines Programms an einer Stelle mal direkt ans LOOP-Ende springen möchte?

Vor dem "LOOP_END:" steht eine schließende gescheifte Klammer einer if-Anweisung

vG

fredyxx

Holomino
09.10.2017, 19:16
Auch wenn ich keinen Arduino habe, es ist alles nur C(++):
- Das Label (die Sprungmarke) wird mit einem Doppelpunkt am Ende gekennzeichnet.
- Die Anweisung (goto) endet immer mit einem Semikolon.

Schreibe also:
goto LOOP_END;

fredyxx
09.10.2017, 19:39
War mir so auch klar. Ist nur ein Schreibfehler.

Wenn ich das aber korrigiere, erhalte ich diese Fehlermeldung:

expected primary-expression before '}' token

HaWe
09.10.2017, 19:59
möglicherweise liegt ein Syntaxfehler innerhalb der Programmteile A und/oder B vor: Klarheit bekommt man nur mit dem echten, vollständigen Code, auf das Mindestmaß zurückgekürzt, aber ohne Pseudo-Umschreibungen.

- - - Aktualisiert - - -

halt stopp,
der Compiler braucht wenigstens ein "leeres statement", also ein "nacktes" Semikolon hinter der Sprungmarke:


void loop() {
// put your main code here, to run repeatedly:

int x=1;

goto LOOP_END;

x=2;

LOOP_END:
;

} //************* ENDE loop

fredyxx
09.10.2017, 23:12
Ja, danke das klappt. Sehr merkwürdig. Wie soll man so was raus kriegen.
Gut dass es das Forum gibt.

vG
fredyxx

Klebwax
10.10.2017, 07:25
Wie soll man so was raus kriegen.


Daß solche Konstrukte wenig besprochen werden, mag daran liegen, daß sie eigentlich nicht verwendet werden. Will man eine Funktion verlassen, schreibt man return. Und eigentlich gehört an das Ende einer Funktion ebenfalls der Befehl return, vor den man ohne Probleme auch ein Label setzen kann. C erlaubt einen laxen Programmierstil, der dem wissenden das Leben einfacher macht. Andere Sprachen sind da strenger, in dem sie z.B. kein goto haben. In C wird nur empfohlen, goto zu vermeiden.

Ein return ohne Rückgabewert kann man am Ende einer Funktion weglassen und hat dann, wie du bemerkt hast, kein Sprungziel für ein goto (und auch keinen Platz für einen Breakpoint) mehr. Es schadet also nicht, an das Ende jeder Funktion ein return zu schreiben.

MfG Klebwax

morob
10.10.2017, 08:41
in dem man sauber programmiert.
goto in c++ ist wirklich schon ...

HaWe
10.10.2017, 09:56
Ja, danke das klappt. Sehr merkwürdig. Wie soll man so was raus kriegen.
Gut dass es das Forum gibt.

vG
fredyxx

ich bin auch nicht sofort drauf gekommen.
Deine Fehlermeldung musste ich mir noch mal auf der Zunge zergehen lassen:

expected primary-expression before '}' token

er vermisst also einen Befehl oder Ausdruck ("primary expression") vor dem '}' Bezeichner/Zeichen ("Token") .

also habe ich einfach mal einen ganz simplen "echten" Code geschrieben, keine Umschreibungen wie Block A etc, und kompiliert (s.o.) - und siehe da, wenn man ihm nach der Sprungmarke noch den simpelst möglichen Befehl oder Ausdruck gibt, dann geht's!


Und tatsächlich:
schaut man in der Sprachdefinition nach, dann steht da:


Syntax
goto label ;
label : statement

Notes

Because declarations are not statements, a label before a declaration must use a null statement (a semicolon immediately after the colon).
Same applies to a label before the end of a block.

C++ imposes additional limitations on the goto statement, but allows labels before declarations (which are statements in C++)

(http://en.cppreference.com/w/c/language/goto)

also muss nach der Sprungmarke erst noch ein statement folgen, bevor die "Klammer-Zu" vom Block-Ende kommen darf, ganz egal ob C oder C++, und statements enden immer mit einem ";", und das einfachste denkbare statement ist nur ein ";" (ein sog. null-statement).

Abschließend betrachtet war es wichtig, einfach mal das Problem an einem möglichst einfachen Beispiel durchzuspielen, nicht am komplizierten Projekt-Code, und auf keinen Fall mit Pseudo-Umschreibungen als Platzhalter.


PS,
insb. @ Klebwax und morob:
Die Arduino-loop() hat bestimmte Eigenheiten, die besondere Programmiertechniken erfordern, indes ist ein goto auch sonst immer noch völlig legaler C- und C++ -Code, auch wenn es manchen Leuten geschmacklich nicht passt. Darum führen solche Einwürfe wie eure generell nicht weiter - denn wie heißt es so schön:
de gustibus non est disputandum.