Pages: [1] 2   Go Down
Author Topic: loop() abbrechen  (Read 2027 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 2
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1891
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3035
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;
Logged

Offline Offline
Newbie
*
Karma: 2
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

danke Jurs, genau danach hab ich gesucht
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

_______
Manfred

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1891
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

Quote
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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21644
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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
« Last Edit: March 18, 2013, 02:26:41 pm by uwefed » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3050
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 return; 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:
return; 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.
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1891
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

Quote
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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21644
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Da es hier auch gefragt wurde:
return; 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.
Logged

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1891
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

michael war schneller. blödes handytippen.
Quote
So aber: Hört auf Stefan Eisebaer
eisebär ist kein nachname, sondern ein titel.
also; eisebär stefan

gruß stefan
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21644
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

eisebär ist kein nachname, sondern ein titel.
also; eisebär stefan
gruß stefan
und wird e.b. abgekürzt; also
e.b.Stefan  smiley-wink smiley-wink smiley-wink smiley-wink
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

Quote
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
smiley-lol  smiley-lol  smiley-lol
Logged

_______
Manfred

Wien
Offline Offline
Edison Member
*
Karma: 28
Posts: 1891
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du konntest mir ja nicht einfach glauben, was?
Logged

Cloppenburg
Offline Offline
Edison Member
*
Karma: 30
Posts: 1280
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Und dass auf sein 500sten Post
Logged

Nicht Mensch, nicht Tier: Programmierer halt...

Pages: [1] 2   Go Up
Jump to: