Ja, danke das klappt. Sehr merkwürdig. Wie soll man so was raus kriegen.
Gut dass es das Forum gibt.
vG
fredyxx
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 13:07 Uhr) Grund: typo
Lesezeichen