loop() abbrechen

Puristen lehnen auch einbreak; odercontinue; in Schleifen ab, weil man das gut durch ein if und zwei an den richtigen Stellen gesetzten geschweiften Klammern simulieren kann. (Sie nennen das natürlich ein "verkapptes goto")
Wenn man die Klammern aber nicht richtig einrückt, ist das Ergebnis auch nicht lesbarer als eine gepflegte Portion Spaghetti-Code.

Wenn man die schliessenden Klammern zusätzlich zum richtigen Einrücken noch mit Kommentaren versehen muss, um sich an die Logik zu erinnern

          ...
        } // end while
      }  // end else "Error"
    }  // end äussere Schleife 1
    // keine Ahnung ob dieser Code nicht eigentlich woanders hingehört.
  } end "if there is something to do"
}  // end function

... kann man die Qualen eines Anonymen Goto-Programmierers nachempfinden, der weiß: es bleibt nicht beim simplen return;, Rückfall ist Rückfall.

Ausserdem, auch Funktionen mit Rückgabewert kann man so schreiben, dass sie nur am unteren Ende mit

  ...
  return retval;
}

verlassen werden.

der typ, der früher im thread das return abgelehnt hat (Ihr wißt schon, der, der nicht einmal wußte, was ein break macht),

Danke

inzwischen denke ich schon eher so wie dieser typ vom anfang des threads (Ihr wißt schon, der, der nicht einmal wußte, was ein break macht),

Vielen Herzlichen Dank

Stefan, ist alles ironisch und scherzhaft gemeint. "Tratzn" unter Freunden.

Einmal eine Gegenüberstellung eines Microsoft!!!!-Basic GOTO wie im C64 oder VC20 mit einem ANSI-C

Schleife:

20 IF (eingangwert <> 1) GOTO 20

in C:

While (eingabewert != 1){}

Auswahl

10 Eingangewert lesen.
20 IF (eingangwert = 1) GOTO 100
30 IF (eingangwert = 2) GOTO 200
40 IF (eingangwert = 3) GOTO 300
50 GOTO 10
...
100 Tu irgenwas
110 GOTO 10
...
200 Tu irgenwas anderes
210 GOTO 10
...
300 Tu irgenwas drittes
310 GOTO 10

in C:

switch (eingangwert)
  {
  case 1:
  Tu irgenwas;
  case 2:
  Tu irgenwas anderes;
  case 3:
  Tu irgenwas drittes;
  }

Basic

20 GOSUB 100
...
30 GOSUB 100
...
100 Tu irgendwas
110 RETURN

C-Variante:

c = meinefunktion (a,b)
...
int meinefunktion (int a, int b)
  {
  Tue irgendwas;
  return(rückgabewert);
  }

In wenigen Worten.
In C machen die geschwungenen Klammern, die einen Codeblock definieren, verschiedene Kontrollstrukturen (if-else, while, do while, switch case) und die möglichkeit Funktionen selbst zu definieren, den Einsatz von GOTO überflüssig.

Grüße Uwe

So weit ich Eure Begründungen verstanden habe, geht es bei der Ablehnung des Goto mehr ums Thema Spaghetticode.
Also um die Übersichtlichkeit und Lesbarkeit des Codes.
In meinem speziellen Fall wäre das Goto (zwar durch Verwendung von if und zusätzlichen Variablen) umgehbar gewesen, macht (meines Erachtens) den Code aber effektiv "lesbarer".

Wie sieht es nun aber aus technischer Sicht aus.
Beeinflusst das Goto die Geschwindigkeit oder den Ram-Verbrauch bei der Ausführung negativ?

spaceball:
Wie sieht es nun aber aus technischer Sicht aus.
Beeinflusst das Goto die Geschwindigkeit oder den Ram-Verbrauch bei der Ausführung negativ?

Nein, natürlich nicht.

Der klassische Anwendungsfall für ein goto unter C/C++ ist üblicherweise der Abbruch aus einer verschachtelten Konstruktion von for-Schleifen.

for ...
{
  for ...
  {
    for ...
    {
      if(Abbruchbedingung) 
        goto funktionsende;
    }
  }
}
funktionsende:

Aus so einer Konstruktion kommst Du nur mit goto elegant heraus.

Klar, mit einigen wenig eleganten Klimmzügen ginge es auch ohne...

Aber es gibt eben auch Fälle, in denen ein einzelnes goto die Lesbarkeit und Verständlichkeit des Codes erhöhen kann.

Stefan, ist alles ironisch und scherzhaft gemeint. "Tratzn" unter Freunden.

ein gaanz liebes winken aus wien über den brenner.

gruß stefan

michael_x:
Uwe, wenn du - ganz alte Schule - wenigstens richtig eingerückt hättest, hätten wir uns ja streiten können, ob ein vorzeitiges
** **return;** **
auch unsauber ist.

So aber: Hört auf Stefan Eisebaer! Ein [b]return;[/b] an der richtigen Stelle verhindert oft unnötig tiefe if - Schachtelungen und trägt eher zur Klarheit bei als ein goto ende;

Den Unterschied zwischen break; und return; hätte ich dir übrigens zugetraut, Uwe. Oder hab ich dich nur falsch verstanden?

Da es hier auch gefragt wurde:
[b]return;[/b] beendet die aktuelle Funktion ( z.B. loop () ), egal wie tief in if/for/while oder sonstigen Blöcken.

** **break;** **
geht nur, um eine Schleife ( for/while ) innerhalb der Funktion abzubrechen, um direkt nach der Schleife weiterzumachen.

S.g. Michael
ich sitze schon 2 Tage beim Suchen was ist jetzt die richtig Vorgehensweise, weil ich will mit der Fernbedienung
den Programmablauf (wenn alles fertig ist Laufzeit ca. 1 Stunde) beenden und in eine Standard Beleuchtung übergehen. Genau das return will ich einbauen . Bitte weist du wo es vielleicht etwas gibt wo ein nicht Profi so wie du das als Beispiel zum nachvollziehen herunterladen kann. Das was ich gefunden habe steht eh hier auf den 2 Seiten (da viele Meinungen wahren ist es für mich verwirrend gewesen was ist richtig. Aber du hast mir schon einige male geholfen deswegen halte ich mich nach deinen Anweisungen.)
Danke im voraus
mfg
Herbert

Selten dass 3 Jahre alte Threads trotz Warnung wieder aufgewärmt werden.

Deine Frage hat auch, wenn ich sie richtig verstehe, nichts mit diesem Thread zu tun.

Ich verstehe das so, dass nach ca. 1 Stunde der Arduino sich tot stellen soll und ausser Strom verbrauchen nichts mehr machen soll?

Da gibt es mindestens zwei Ansätze:

bool alles_erledigt; 
void loop() {
   if ( alles_erledigt ) return; // loop wird ohne weitere Aktionen sofort beendet
   ... anderer Code, der eventuell alles_erledigt auf true setzt.
}
bool alles_erledigt; 
void loop() {
   while ( alles_erledigt ) {}; // loop hängt hier auf ewig fest
   ... anderer Code, der eventuell alles_erledigt auf true setzt.
}

Im ersten Fall, kannst du vor if (alles_erledigt) noch was einbauen, das weiter aktiv bleibt. Eventuell auch die Variable alles_erledigt wieder auf false setzen. Im zweiten Fall geht nichts mehr ausser Reset.

michael_x:
Selten dass 3 Jahre alte Threads trotz Warnung wieder aufgewärmt werden.

Deine Frage hat auch, wenn ich sie richtig verstehe, nichts mit diesem Thread zu tun.

Ich verstehe das so, dass nach ca. 1 Stunde der Arduino sich tot stellen soll und ausser Strom verbrauchen nichts mehr machen soll?

Da gibt es mindestens zwei Ansätze:

bool alles_erledigt; 

void loop() {
  if ( alles_erledigt ) return; // loop wird ohne weitere Aktionen sofort beendet
  ... anderer Code, der eventuell alles_erledigt auf true setzt.
}







bool alles_erledigt;
void loop() {
  while ( alles_erledigt ) {}; // loop hängt hier auf ewig fest
  ... anderer Code, der eventuell alles_erledigt auf true setzt.
}




Im ersten Fall, kannst du vor if (alles_erledigt) noch was einbauen, das weiter aktiv bleibt. Eventuell auch die Variable `alles_erledigt` wieder auf false setzen. Im zweiten Fall geht nichts mehr ausser Reset.

Hallo Michael

vorerst einmal Danke
nein es soll sich nicht tot stellen sondern wenns mir nicht mehr passt will ich nicht 1 Stunde warten bis es fertig ist sondern auf der Fernbedienung zb die Taste Mode drücken und das Programm bricht ab und geht zurück in die Standartbeleuchtung (ist die gleiche beleuchtungsart als wie wenn das Programm voll durchgelaufen währe) jetzt will ich Programm2 mittels Fernbedienung drücken der Taste2 starten und wenns mir wieder mehr passt abbrechen zb wieder mit Taste Mode der Fernbedienung. Das starten der verschiedenen Programme funktioniert ja schon (aber nur Dank deiner Hilfe)

lg.Herbert

[/quote]

Haus-5d-Forum.ino (11.7 KB)

Und was hat das mit dem c-Schlüsselwort "return" zu tun?

Als Pseudo-Code sehe ich sowas:

bool sonderProgramm; // true = Beleuchtungsprogramm läuft, false = Standardbeleuchtung
void loop () {
   long result = FB_Lesen();
   if (sonderProgramm && result == MODE_TASTE) sonderProgramm = false;
   ... andere Tasten auswerten, evtl. Sonderprogramm starten ? 


   if ( sonderProgramm ) sonderProgramm = sonderProgrammAblaufSteuerung();
   else standardBeleuchtung(); 

}

bool sonderProgrammAblaufsteuerung() {
// kommt immer wieder dran und hat keine ( oder nur kurze ) delays ...
// liefert true solange Programm aktiv ist, false bei Ende
  static int zustand; // ...  
  static unsigned long lastchange; // für Wartezeiten ...
  ... 

  if ( zustand == FERTIG) return false;
  ...
  return true;
}

Ich hab ja keine Ahnung hab vor ca. 6 Wochen mit der ganzen Materie angefangen . Bin der Meinung das ich e schon weit bin, darum üben, lernen deine Informationen sammeln , umsetzten und probieren.
Aber irgendwann steht man halt bei einer Situation an, sucht Infos im WEP (liest etwas wo man der Meinung ist zb retour) versucht es halt umzusetzen und kommt nicht weiter. Daraus ist meine anfrage bei dir entstanden.

Aber Danke für deine Bemühung
lg Herbert