loop() abbrechen

Hallo liebes Forum,

Hab mal wieder ein kleines Problem: Ich möchte einige Messungen durchführen und wenn eine Messung die Sollwerte nicht einhält den Rest des Programms nicht ausführen und von vorn beginnen. Quasi die loop Schleife neu beginnen. Mit break; geht's nicht, gibts vllt. nen andere Befehl dafür?

Liebe Grüße

Max

hi,

was bringt ein return; in der loop-funktion? sollte doch die funktion beenden und durch das umgebende (ich glaube) while von vorn beginnen.

gruß stefan

hypermax:
Hab mal wieder ein kleines Problem: Ich möchte einige Messungen durchführen und wenn eine Messung die Sollwerte nicht einhält den Rest des Programms nicht ausführen und von vorn beginnen. Quasi die loop Schleife neu beginnen. Mit break; geht's nicht, gibts vllt. nen andere Befehl dafür?

Hey, dafür gibt's noch immer das gute alte GOTO: Setzt Du am Anfang der loop eine Sprungmarke
loopstart:

Und von wo aus in der loop Du wieder an den Anfang springen möchtest, fügst Du ein:
goto loopstart;

danke Jurs, genau danach hab ich gesucht

GOTO ist NoGo.
Egal was und wie man programmiert: ein GOTO braucht man nicht. Niemals. Never Ever.
Gar nicht erst angewöhnen, es gibt immer einen eleganteren Weg.

Und wie Eisebaer schon geschrieben hat, kannst Du für Deinen Zweck einfach "return" verwenden.

hi,

GOTO ist NoGo.
Egal was und wie man programmiert: ein GOTO braucht man nicht. Niemals. Never Ever.
Gar nicht erst angewöhnen, es gibt immer einen eleganteren Weg.

dafür befördere ich Dich zum God Member.
bei Deinem nächsten post kannst Du es überprüfen...

gruß stefan

hypermax:
Hallo liebes Forum,

Hab mal wieder ein kleines Problem: Ich möchte einige Messungen durchführen und wenn eine Messung die Sollwerte nicht einhält den Rest des Programms nicht ausführen und von vorn beginnen. Quasi die loop Schleife neu beginnen. Mit break; geht's nicht, gibts vllt. nen andere Befehl dafür?

Liebe Grüße

Max

Bei solchen Fragen stehen mir die Haare zu berge...

Also mal ans teoretische:
C wird gestartet idem die Funktion main() 1 mal aufgerufen wird. Diese befindet sich bei Arduino im File mail.ccp und sieht bei der Version 1.0.4 so aus:

#include <Arduino.h>

int main(void)
{
	init();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

Ein return() würde die Forschleife mit dem nächsten Wert wieder aufrufen.
Ein break() eigentlich auch.
Goto bleibt in der loop() Funktion.

Ich komme aber von der alten Schule wo man mir gelehrt hat daß GOTO ein Basikbefehl ist und keine C-Anweisung.

Die C-Syntax bzw Aufbau des Programms mit den Funktionen macht ein goto überflüssig.

Beispiel:

loop()
{
Wert einlesen
if (wert == ok)
{
Wert weiterverarbeiten 
usw
}
}

Wenn ein Fehlerfall eintritt und die loop() Funktion nicht weiterabgearbeitet werden soll, einfach die nachfolgengen Programmteile nur bei richtiger if-Bedingng abarbeiten. In meinem Beispiel wird der Sketch bei unwahrer Bedingung nach dem if nicht mehr abgearbeitet und die loop() funktion beendet um dann im main() wieder aufgerufen zu werden.

Grüße Uwe

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.

hi,

Ein return() würde die Forschleife mit dem nächsten Wert wieder aufrufen.
Ein break() eigentlich auch.
Goto bleibt in der loop() Funktion.

ein break würde nicht aus der funktion springen...
ein goto braucht man nicht besprechen...
aber was spricht gegen ein return?
in der for-schleife gibt es keinen nächsten wert. abbruchbedingung erfüllt>abbruch
ich habe returns ohne rückgabewert in beispielsketches von libraries gesehen, warum sollte man die loop als sonderfall hehandeln?

gruß stefan

michael_x:
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.

Welch peinlicher Fehler.

hi,

michael war schneller. blödes handytippen.

So aber: Hört auf Stefan Eisebaer

eisebär ist kein nachname, sondern ein titel.
also; eisebär stefan

gruß stefan

Eisebaer:
eisebär ist kein nachname, sondern ein titel.
also; eisebär stefan
gruß stefan

und wird e.b. abgekürzt; also
e.b.Stefan :wink: :wink: :wink: :wink:

Eisebaer:
hi,

GOTO ist NoGo.
Egal was und wie man programmiert: ein GOTO braucht man nicht. Niemals. Never Ever.
Gar nicht erst angewöhnen, es gibt immer einen eleganteren Weg.

dafür befördere ich Dich zum God Member.
bei Deinem nächsten post kannst Du es überprüfen...

gruß stefan

XD XD XD

Du konntest mir ja nicht einfach glauben, was?

Und dass auf sein 500sten Post

Ich riskiers mal, daß Ihr mich gleich steinigt.....

Ich bin ein try & error Autodidakt und hab auch schon GOTO verwendet.
:blush:
Nach diesem Beitrag hab ich beschlossen den "Anonymen Goto-Programmierern" beizutreten und das GOTO nicht mehr zu verwenden.

Aber.... Warum???
Was spricht dagegen?

Eisebaer:
Du konntest mir ja nicht einfach glauben, was?

Hätt ja auch nur ein Weana Schmäh sein können... XD

spaceball:
Ich riskiers mal, daß Ihr mich gleich steinigt.....

Ich bin ein try & error Autodidakt und hab auch schon GOTO verwendet.
:blush:
Nach diesem Beitrag hab ich beschlossen den "Anonymen Goto-Programmierern" beizutreten und das GOTO nicht mehr zu verwenden.

Aber.... Warum???
Was spricht dagegen?

GOTOs machen den Code unübersichtlicher und schwerer lesbar. Und es gibt IMMER einen Lösungsweg der ohne GOTO auskommt. Was ist die logische Konsequenz: kein GOTO verwenden.

Ich gebe zu, auch ich habe schon mal GOTO verwendet. Das war bei meinen ersten Programmierversuchen auf dem Commodore 64. Der dort verwendete BASIC Dialekt zwang einen aber dazu. Nach dreissig Jahren und fast einem dutzend Programmiersprachen später kann ich sagen: es hat sich seitdem für mich nicht einmal ergeben, dass ein GOTO sinnvoll oder gar nötig gewesen wäre.

Als generelle Kurz-vor-Ende - Marke, könnte ich mir Situationen ausdenken, wo ein goto evtl. Sinn machen könnte.
( Wenn z.B. vor dem return noch was aufzuräumen ist )

Die Arduino Referenz zum goto ist eigentlich eine ausgewogene Formulierung

throw ( sowie try/catch ) hab ich auf dem Arduino bisher nicht gesehen. Wenn man sowas ähnliches zu brauchen glaubt, muss man allerdings berücksichtigen, dass man mit goto nicht aus einer Funktion herausspringen kann, und erst recht nicht mitten in eine andere hinein. Lässt sich also auch nicht durch goto realisieren.

Für wilde Hin und Her - Sprünge, und um Schleifen zu erzeugen, taugen goto wirklich nicht.

Man sollte auch keine "Programmablaufpläne" denken, oder gar aufmalen (die mit den rautenförmigen if - Abfragen und vielen langen Strichen auf andere Blätter)

hi,

auch wenn ich das mit dem return in die diskussion gebracht habe:

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), hat eigentlich nicht unrecht.
ein goto hinterlässt oft eine recht undefinierte situation, aber ein return macht ja nichts anderes als ein goto function_end, wenn function_end: am ende der funktion steht.

berechtigt ist das return, wenn damit der rückgabewert der funktion festgelegt wird. danach kann nichts mehr kommen, weil ja damit die funktion ihren zweck erfüllt hat. ebenso bei mehreren returns in if-abfragen.

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), daß man mit bedingungen sauberer programmiert. hab' ich eigentlich auch immer gemacht, ein return ist bei mir zur festlegung des rückgabewerts, aber die fragestellung hat mich verleitet.

wenn man überlegt programmiert und nach einem goto oder return nichts hinterläßt, das schwierigkeiten macht, kann man auch beides verwenden, aber wenn man ein goto ablehnt, hat auch ein return ohne zuweisung nichts im code verloren.

gruß stefan