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;
Hallo,
bei diesem Programmschema
erhalte ich diese Fehlermeldung:Code:void loop() { Programmteil A goto LOOP_END: Programmteil B LOOP_END: } //************* ENDE loop
"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
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;
War mir so auch klar. Ist nur ein Schreibfehler.
Wenn ich das aber korrigiere, erhalte ich diese Fehlermeldung:
expected primary-expression before '}' token
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:
HTML-Code:void loop() { // put your main code here, to run repeatedly: int x=1; goto LOOP_END; x=2; LOOP_END: ; } //************* ENDE loop
Ja, danke das klappt. Sehr merkwürdig. Wie soll man so was raus kriegen.
Gut dass es das Forum gibt.
vG
fredyxx
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
Strom fließt auch durch krumme Drähte !
in dem man sauber programmiert.
goto in c++ ist wirklich schon ...
das leben ist hart, aber wir müssen da durch.
ich bin auch nicht sofort drauf gekommen.
Deine Fehlermeldung musste ich mir noch mal auf der Zunge zergehen lassen:
er vermisst also einen Befehl oder Ausdruck ("primary expression") vor dem '}' Bezeichner/Zeichen ("Token") .expected primary-expression before '}' 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:
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).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)
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.
Geändert von HaWe (10.10.2017 um 14:07 Uhr) Grund: typo
Lesezeichen