LOOP

Aus C64-Wiki
Zur Navigation springenZur Suche springen
LOOP
Syntax: LOOP
Parameter
keine
Einordnung
Typ: Anweisung
Kontext: Strukturkontrolle
Aufgabe: Leitet eine Schleife ein
Abkürzung: keine (TSB: lO)
Token: $64 $3a (100 58)
Verwandte Befehle
END LOOP - EXIT - REPEAT - UNTIL - FOR - NEXT


Dieser Artikel beschreibt das Simons'-Basic-Schlüsselwort LOOP.

Typ: Anweisung
Syntax: LOOP

LOOP definiert den Anfang einer Schleife. Schleife, das ist ein Teil eines Programms, der unter Umständen mehrfach durchlaufen wird.

Die Konstruktion LOOP .. END LOOP stellt letztlich die "Mutter aller Schleifen" dar. Was hier im Schleifenkörper (das ist das, was LOOP und END LOOP einschließen) passiert, beschäftigt den Interpreter unentwegt. Nur mithilfe eines Befehls, der eine Abbruchbedingung überprüft, kann eine Schleife beendet werden. Der nötige und in Simons' Basic natürlich vorhandene (Ausstiegs-) Befehl lautet EXIT.

Mit diesen drei Befehlen (LOOP, END LOOP, EXIT) ist der Programmierer nun in der Lage, verschiedene Schleifentypen herzustellen:

  • Endlosschleifen (die kann man nicht verlassen: kein EXIT),
  • kopfgesteuerte Schleifen (die Ausstiegsbedingung wird gleich am Anfang abgefragt, so dass der Körper unter Umständen gar nicht erst durchlaufen wird),
  • fußgesteuerte Schleifen (da wird erst am Ende des Schleifenkörpers die Ausstiegsbedingung geprüft, so dass er mindestens einmal durchlaufen wird) und
  • Zählschleifen (die werden verlassen, wenn ein Zählwert über- oder unterschritten ist).

Für die letzten beiden Schleifentypen gibt es eigene Befehlsfolgen (REPEAT-UNTIL für fußgesteuerte und FOR-NEXT für Zählschleifen), weshalb hier nur der Typ der kopfgesteuerten Schleifen betrachtet wird.

In anderen Hochsprachen (z.B. in Java und C) gibt es für diesen Typ das Befehlswort WHILE, in der Bedeutung "solange die Bedingung hinter WHILE zutrifft, durchlaufe die Schleife". Der Ausstiegsbefehl ist dabei sozusagen gleich mit im WHILE eingebaut. WHILE stellt SB nicht zur Verfügung, es muss mit LOOP nachgebildet werden. Hier bei LOOP fragt der Interpreter leider anders, nämlich "solange die Bedingung hinter EXIT nicht zutrifft, durchlaufe die Schleife", also logisch genau anders herum.

Die folgende Schleife (in Pseudocode):

A = 0
WHILE A<10 DO
  PRINT A;
  A = A+1
WEND

müsste in Simons' Basic so aussehen (mit NOT wird hier dem "anders herum" Rechnung getragen):

10 A = 0
20 LOOP
30   EXIT IF NOT(A<10)
40   PRINT A;
50   A = A+1
60 END LOOP

Ergebnis (bei beiden Programmen): 0 1 2 3 4 5 6 7 8 9. Wer sich nicht an negativ formulierte logische Terme (NOT) gewöhnen kann, müsste schreiben:

10 A = 0
20 LOOP
30   EXIT IF A>9
40   PRINT A;
50   A = A+1
60 END LOOP

Also mit einer Abbruchbedingung, die wirklich genau anders herum formuliert ist und nebenbei auch verständlicher und klarer ist.


Es sind bis zu 5 Verschachtelungsebenen möglich. Bei der sechsten quittiert das Programm mit Fehlermeldung ?STACK TOO LARGE ERROR. Da LOOP einen eigenen Stack besitzt, ist es völlig unabhängig von der Nutzung des BASIC-Stacks und etwaigen Verschachtelungen von REPEAT.
Erst die TSB-Version des Befehls stellt die im Simons' Basic Handbuch versprochene Stack-Tiefe von 20 (entspricht 10 Verschachtelungen) auch tatsächlich zur Verfügung. Wird sie überschritten, gibt es einen ?STACK OVERFLOW ERROR.

Der Stack der LOOP-ENDLOOP-Konstruktion wird nicht überwacht. Verlässt man eine solche Schleife vorzeitig ohne dabei den dafür vorgesehenen Befehl EXIT zu benutzen, wird der Stack nicht bereinigt und kann bei wiederholter Ausführung überlaufen. Um das zu verhindern, kann man die Speicherstelle $C641 (den LOOP-Stackpointer) bei einem vorzeitigen Schleifenausstieg manipulieren.


Beispiel[Bearbeiten | Quelltext bearbeiten]

Beispiel für eine kopfgesteuerte Schleife:

10 A$ = ""
20 LOOP
30   EXIT IF PLACE(A$,"jnJN")
40   PRINT "Ja (j) oder Nein (n)? ";
50   FETCH "{crsr right}", 1, A$
60 END LOOP

Man kann alle Buchstaben eingeben, aber die Schleife wird erst verlassen, wenn "j" oder "n" getippt wurde (auch groß geschrieben). Wenn A$ bereits einen der Tastendrücke enthielte, würde die Abfrage gar nicht erst stattfinden (z.B. das Beispiel mit A$="j" in Zeile 10 probieren).