Schleifenabbruch

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Schleifenabbruch

Beitrag von Manfred »

Hi,

ich hoffe dass ich meine Frage vernünftig formuliere und kein großes Chaos verursache damit.... :lol:

Mir geistert die ganze Zeit ein Problem durch den Kopf, zu dem ich keine Lösung finde. Vielleicht gibt es ja keine, oder aber ich denke mal wieder falsch.

Folgendes Problem stellt sich:

Ich habe eine Do While Schleife, in der etliche Funktionen abgearbeitet werden müssen. Wenn irgendeine davon ein .F. zurückliefert sollte eigentlich die Schleife abgebrochen werden. Im Moment fällt mir dazu nur jedesmal ein If Endif ein, innerhalb dessen ein EXIT stehen würde, wenn ein .F. zurückgeliefert wird. Das heißt also, wenn ich z.B. 10 Funktionen aufrufe, dann müßte ich aber 30 Zeilen schreiben:

Code: Alles auswählen

Do while .T.
.....
if ! funktion1()
   EXIT
ENDIF
if ! funktion2()
   EXIT
ENDIF
.....
ENDDO
Geht das nicht auch anders, das ich nur die Funktion aufrufe und wenn die ein .F. zurückliefert die Schleife auch beendet werden kann? So wie z.B. ein READ entsprechend an jeder Stelle abgebrochen werden kann. Das Problem ist halt, das mit WHILE halt immer erst wieder bis zum Anfang gegangen werden muß, bis die Abbruchbedingung geprüft werden kann.

Es muß ja nicht unbedingt eine While Schleife sein, mir fällt nur nichts anderes ein, was mit Loop gemacht werden könnte für so einen Fall.

PS: Ach so, es wäre natürlich auch denkbar, wenn statt des Exit ein Loop stattfinden würde. Aber irgendwas, was nicht in If Endif eingebettet werden muß.
(Ist jetzt nur ne Frage, wegen des aufgeblähten PRG Codes mit If Endif)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Schleifenabbruch

Beitrag von AUGE_OHR »

hi,
Manfred hat geschrieben: ... Wenn irgendeine davon ein .F. zurückliefert sollte
... und wenn keine ein .F. zurückgibt ... ?

aber nun zu deiner Frage : Wie wäre es mit einem Array/Codeblock ?

Code: Alles auswählen

LOCAL myCodeBlock := {}
...
AADD(myCodeBlock,NextCodeblock)
..
nMax := LEN(myCodeBlock)

FOR i = 1 TO nMax
...
   IF .NOT. EVAL(myCodeblock[i])
       EXIT
   ENDIF
...
NEXT
...
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Jimmy,

wenn .T. zurückgeliefert würde, dann würde es einfach weitergehen.

Hm, mir fiel beim Lesen Deines Vorschlages ein: Es gibt doch die Errorsys, die am Anfang installiert wird und dann auf Fehler "im Hintergrund" reagiert, bzw. wartet. Es wäre doch sicherlich nicht schlecht, wenn man sowas ähnliches bereitstellen könne, was auf bestimmte Variablenänderungen, oder sonstwas reagiert und dann in Erscheinung tritt und entsprechende "Routinen" ausführt. Aber ich denke mal, da ist der Wunschtraum der Vater des Gedanken. Wäre sowas evtl. möglich über Threads selbst zu programmieren? (Nur mal so gesponnen)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Abbruch

Beitrag von Rolf Ramacher »

Hallo Manfred,

wenn eine Funktion .f. liefert sollen dann die anderen trotzdem weiter durchgeführt werden ? Dann könntest du ja vor dem Enddo die Abfrage stellen ?

Ansonsten fällt mir auch nur die jeweilige Abfrage auf .t. oder .f. ein.


gruß Rolf
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
warum löst Du es nicht einfach so:

Code: Alles auswählen

bedingung := .T.
DO WHILE bedingung
  IF ( bedingung := funk1() )
    IF ( bedingung := funk2() )
      IF ( bedingung := funk3() )
        ...
      ENDIF
    ENDIF
  ENDIF
ENDDO
Wobei ich die ausführlichere Variante ob der besseren Lesbarkeit bevorzugen würde:

Code: Alles auswählen

bedingung := .T.
DO WHILE bedingung
  bedingung := funk1()
  IF bedingung
    bedingung := funk2()
    IF bedingung
      bedingung := funk3()
      ...
    ENDIF
  ENDIF
ENDDO
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

@Rolf,

nein, wenn .F. zurückkommt, dann soll in der Regel nicht weitergemacht werden.

@Martin,

dieses Idee mit IF() kam mir auch schon. Ist aber eigentlich nur eine Veränderung und keine Verkürzung.

War ja auch nur so eine Frage (wie immer von mir ;-) ) Ich dachte evtl. sagt hier einer: Klar, geht das, baust Du das Objekt so und so und dann geht das im Hintergrund, oder so. (Ja, naiv muß man sei.)


Puh, im Moment dauert es aber knasterlange, bis ich eine Mail bekomme, das hier im Forum Antworten eingestellt wurden. Ist das nur bei mir so?
Bis jetzt habe ich zu den letzten beiden noch keiner erhalten, sondern nur über regelmäßiges Nachgucken gemerkt, das was geschrieben wurde.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Mafred,

und wenn du es folgend machst?

Code: Alles auswählen


DO WHILE .t. .AND. funk1() .AND. funk2() .AND. funk3()
  
      ...
    
ENDDO
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Andreas,

wäre auch eine Idee, klappt aber dann nur, wenn NUR Funktionen vorhanden sind.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Manfred hat geschrieben:Hi Andreas,

wäre auch eine Idee, klappt aber dann nur, wenn NUR Funktionen vorhanden sind.
Wieso nur Funktionen. Du kannst ja auch anstatt der Funktionen die Methoden Setzen:

Code: Alles auswählen

DO WHILE .t. .AND. funk1( parameter ) .AND. ::funk2( parameter ) .AND. oObjekt:funk3( parameter ) 
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Andreas,

Mistverständnis.... :-)

Es könnte ja auch noch anderer Quelltext dazwischen stehen. Das meinte ich.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
Manfred hat geschrieben:dieses Idee mit IF() kam mir auch schon. Ist aber eigentlich nur eine Veränderung und keine Verkürzung.
nun - zumindest mein erstes Beispiel ist eine Verkürzung! Du brauchst kein EXIT und sparst Dir somit bei 10 Funktionen 12 Zeilen Code :wink:

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

wenn nur die Funktionen sind, dann ja, aber wie schon gesagt, es ist gemischt und dann ist Dein Vorschlag nicht so günstig.

Obwohl.....

Ich schätze mal, das alle Vorschläge irgendwie übersetzbar sind.
Muß ich mal austesten....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Manfred.

Code: Alles auswählen

DO WHILE ..
BEGIN SEQUENCE
IF func1()
  ..
  ELSE
  BREAK
ENDIF
IF func2()
  ..
  ELSE
  BREAK
ENDIF
END SEQUENCE
* Abbruchbedingung?
ENDDO
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Tom,

daran hatte ich auch schon gedacht, war mir aber nicht sicher, ob es vernünftig ist es einzusetzen. Aber war da nicht was mit KEIN LOOP usw.?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten