INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Schleife erzwingen von vorne durchzulaufen
18.09.2015, 09:38
Beitrag #9
RE: Schleife erzwingen von vorne durchzulaufen
Danke für eure Antworten.

Ich habe in den case's teilweise schleifen, mit weiteren verschachtelten schleifen darin. Ich müssten dann einen Parameter für das abbrechen setzen, und in jeder dieser Schleifen (teilweise in anderen Funktionen die von dem case aufgerufen werden) eine Abfrage für diesen Parameter machen und dann mit break; die Schleife beenden. Mit GoTo könnte man das ganze gut umgehen. Ich denke, damit probiere ich es mal, danke.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.09.2015, 09:42 (Dieser Beitrag wurde zuletzt bearbeitet: 18.09.2015 09:47 von HaWe.)
Beitrag #10
RE: Schleife erzwingen von vorne durchzulaufen
ein goto Sprungbefehl ist absolut ok, nur muss dieser innerhalb ein und desselben Funktionsblocks liegen.

Ich weiß, dass manche Code-Puristen diesen verpönen, doch das ist m.E unberechtigt - gerade der C Compiler setzt Sourcecode sehr asm-ähnlich um und wandelt bestimmte Befehle direkt in Sprungbefehle um.
So ist zum Beispiel gerade die switch- case-Anweisung nichts anderes als ein goto Befehl, wobei die Fallkonstanten
1:
2:
3:
genau die Sprungmarken sind (und deshalb dürfen die Fallkonstanten auch keine Variablen sein, denn Sprungmarken müssen immer konstant sein !).

Wenn dir also ein Goto hilft: Mach es!

Code:
if (Bedingung) goto LABEL
//...
//...
LABEL:
// hier geht's dann weiter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.09.2015, 10:03
Beitrag #11
RE: Schleife erzwingen von vorne durchzulaufen
(18.09.2015 09:38)scritch schrieb:  Ich habe in den case's teilweise schleifen, mit weiteren verschachtelten schleifen darin. Ich müssten dann einen Parameter für das abbrechen setzen, und in jeder dieser Schleifen (teilweise in anderen Funktionen die von dem case aufgerufen werden) eine Abfrage für diesen Parameter machen und dann mit break; die Schleife beenden.
Dann nimm einfach return, das springt ganz aus der Funktion raus.
...und wenn das ganze zu komplex wird, dann lagere Teile davon in eigene Funktionen aus, zur Not das ganze Switch.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.09.2015, 10:39 (Dieser Beitrag wurde zuletzt bearbeitet: 18.09.2015 10:43 von scritch.)
Beitrag #12
RE: Schleife erzwingen von vorne durchzulaufen
(18.09.2015 10:03)Thorsten Pferdekämper schrieb:  Dann nimm einfach return, das springt ganz aus der Funktion raus.
...und wenn das ganze zu komplex wird, dann lagere Teile davon in eigene Funktionen aus, zur Not das ganze Switch.
Das switch-case ist tatsächlich in meiner Hauptschleife und recht komplex. Ich denke das werde ich in eine Funktion auslagern. Das mit dem return verstehe ich auf mein Beispiel gemünzt aber noch nicht so recht. Hier müsste ich doch auch in der Funktion f_irgendwas(); einen Parameter setzen, den ich dann nachher in jedem case in der Haupt(Schleife, später Funktion), abfragen muss, damit die Funktion verlassen werden kann.

HaWe, das GoTo muss in einem Funktionsblock liegen soll heissen, dass ich mit einem GoTo aus f_A(); nicht zu einer Sprungmarke in f_B(); oder die Hauptschleife springen kann?

Edit OT: Kurzes OT zu diesem Thread. Für die bessere Übersichtlichkeit (1400 Zeilen Coode) würde ich gerne einige Funktionen in ein anderes Teilskript auslagern. Kann mir jemand schnell den Kniff verraten? Ich kann in der IDE ja einen neuen "Tab" aufmachen und da Code reinverlagern. Aber wie stelle ich die Verknüpfung zu diesem Code her?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.09.2015, 10:48 (Dieser Beitrag wurde zuletzt bearbeitet: 18.09.2015 10:48 von HaWe.)
Beitrag #13
RE: Schleife erzwingen von vorne durchzulaufen
innerhalb einer Funktion kannst du überall hinspringen, nur nicht aus der Funktion hinaus und woanders wieder rein in eine ganz andere Funktion.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.09.2015, 10:50
Beitrag #14
RE: Schleife erzwingen von vorne durchzulaufen
(18.09.2015 10:48)HaWe schrieb:  innerhalb einer Funktion kannst du überall hinspringen, nur nicht aus der Funktion hinaus und woanders wieder rein in eine ganz andere Funktion.

Schade, dann hilft mir das nicht :-(
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.09.2015, 10:52
Beitrag #15
RE: Schleife erzwingen von vorne durchzulaufen
(18.09.2015 10:39)scritch schrieb:  Das mit dem return verstehe ich auf mein Beispiel gemünzt aber noch nicht so recht. Hier müsste ich doch auch in der Funktion f_irgendwas(); einen Parameter setzen, den ich dann nachher in jedem case in der Haupt(Schleife, später Funktion), abfragen muss, damit die Funktion verlassen werden kann.
Hi,
dann musst Du halt in f_irgendwas eine globale Variable beeinflussen (was Du ja schon gezeigt hast), die Du dann abfragst oder Du lässt f_irgendwas einen entsprechenden Rückgabewert zurück geben. Das sieht dann in etwa so aus:
Code:
int var1;
int var2;

loop(){ // Hauptschleife

f_irgendwas();
//tue dies
//mache das

switch(var1){
   case 1:
     if(f_irgendwas() == 1) return;
     //irgendwas das lange dauert zu durchlaufen
     break;

// [...]

   }
}

int f_irgendwas(){
   if(bedingung erfüllt){
     var1 = 1; //, 2 oder 3
     return 1;
   }else{
     return 0;
}
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.09.2015, 11:36 (Dieser Beitrag wurde zuletzt bearbeitet: 18.09.2015 11:37 von scritch.)
Beitrag #16
RE: Schleife erzwingen von vorne durchzulaufen
Zum Verständnis, das würde gehen, sprich das return; in der Funktion würde bewirken, dass die Schleife in f_irgendwas() nicht zu Ende durchgeführt wird und ich nach 5 Sek. das Serial.println("in der hauptschleife"); zu sehen bekommen würde?

Code:
int var = 0;

void loop(){
  f_irgendwas()  
  Serial.println("in der hauptschleife");
}

void f_irgendwas(){
  while(var < 100){
    Serial.println(var);
    var++;
    delay(1000);
    if(var == 5){
      return;
    }
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  while Schleife nach sleep mode interrupt tklaus 13 238 23.11.2016 17:40
Letzter Beitrag: Tommy56
  Do-While-Schleife Abbruchbedinung Majera 14 240 22.11.2016 18:07
Letzter Beitrag: Pit
  Schleife Hannes 3 188 16.11.2016 00:54
Letzter Beitrag: Hannes
  Problem: SDFat - Das Ende einer Datei finden und Schleife beenden MartinK 4 486 01.04.2016 05:49
Letzter Beitrag: MartinK
  for - Schleife #elextro19 6 706 27.03.2016 13:21
Letzter Beitrag: #elextro19
  Aus While-Schleife durch Interrupt aussteigen Zill3 10 1.175 08.02.2016 16:28
Letzter Beitrag: ardu_arne
  Kann ich in eine For Schleife einen delay einbauen JanGamer11 6 610 05.01.2016 12:34
Letzter Beitrag: Hilgi
  digitalRead in einer Schleife luto92 5 828 15.10.2015 22:09
Letzter Beitrag: hotsystems
  Schleife wiederholen diode1990 1 752 07.08.2015 20:34
Letzter Beitrag: Thorsten Pferdekämper
  AnalogRead aus Loop-Schleife auskoppeln dna5544 7 1.469 16.07.2015 12:31
Letzter Beitrag: dna5544

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste