LOOP
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).
$ | % | @ | ANGL | ARC | AT | AUTO | BCKGNDS | BFLASH | BLOCK | CALL | CENTRE | CGOTO | CHAR | CHECK | CIRCLE | CMOB | COLD | COLOUR | COPY | CSET | DELAY | DESIGN | DETECT | DIR | DISABLE | DISAPA | DISK | DISPLAY | DIV | DOWN | DRAW | DUMP | DUP | ELSE | END LOOP | END PROC | ENVELOPE | ERRLN | ERRN | EXEC | EXIT | EXOR | FCHR | FCOL | FETCH | FILL | FIND | FLASH | FRAC | GLOBAL | GRAPHICS | HI COL | HIRES | HRDCPY | INKEY | INSERT | INST | INV | JOY | KEY | LEFT | LIN | LINE | LOCAL | LOOP | LOW COL | MEM | MERGE | MMOB | MOB OFF | MOB SET | MOD | MOVE | MULTI | MUSIC | NO ERROR | NRM | OFF | OLD | ON ERROR | ON KEY | OPTION | OUT | PAGE | PAINT | PAUSE | PENX | PENY | PLACE | PLAY | PLOT | POT | PROC | RCOMP | REC | RENUMBER | REPEAT | RESET | RESUME | RETRACE | RIGHT | RLOCMOB | ROT | SCRLD | SCRSV | SECURE | SOUND | TEST | TEXT | TRACE | UNTIL | UP | USE | VOL | WAVE