- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: Sprungbefehl klapppt nicht

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242

    Sprungbefehl klapppt nicht

    Anzeige

    E-Bike
    Hallo,

    bei diesem Programmschema

    Code:
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    899
    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;

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    War mir so auch klar. Ist nur ein Schreibfehler.

    Wenn ich das aber korrigiere, erhalte ich diese Fehlermeldung:

    expected primary-expression before '}' token

  4. #4
    HaWe
    Gast
    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

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Ja, danke das klappt. Sehr merkwürdig. Wie soll man so was raus kriegen.
    Gut dass es das Forum gibt.

    vG
    fredyxx

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von fredyxx Beitrag anzeigen
    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
    Strom fließt auch durch krumme Drähte !

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.06.2004
    Ort
    Berlin
    Alter
    59
    Beiträge
    540
    in dem man sauber programmiert.
    goto in c++ ist wirklich schon ...
    das leben ist hart, aber wir müssen da durch.

  8. #8
    HaWe
    Gast
    Zitat Zitat von fredyxx Beitrag anzeigen
    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.
    Geändert von HaWe (10.10.2017 um 14:07 Uhr) Grund: typo

Ähnliche Themen

  1. NIBObee lässt sich nicht in Betrieb nehmen, weil Upload nicht funktioniert
    Von Robo Newbie im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 3
    Letzter Beitrag: 31.08.2015, 13:00
  2. Code läuft nicht feherfrei, bitte um Hilfe! Input Capture und UART nicht gleichzeitig
    Von Accenter im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 04.06.2013, 21:00
  3. Antworten: 6
    Letzter Beitrag: 29.08.2011, 18:17
  4. Antworten: 5
    Letzter Beitrag: 08.10.2008, 14:30
  5. Antworten: 25
    Letzter Beitrag: 21.08.2008, 23:33

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress