LOOP (BASIC 3.5)

Aus C64-Wiki
Zur Navigation springenZur Suche springen
LOOP (BASIC 3.5)
Syntax: LOOP [UNTIL|WHILE <Bedingung>]
Parameter
<Bedingung>: beliebiger Ausdruck, dessen Ergebnis als logisch falsch bzw. logisch wahr interpretiert werden kann
Einordnung
Typ: Anweisung
Kontext: Programmstruktur
Aufgabe: Abschluss einer DO-LOOP-Schleife
Abkürzung: loO
Token: $ec (236)
Verwandte Befehle
DO, EXIT, FOR, UNTIL, WHILE

Anmerkung: Dieser Artikel beschreibt die BASIC-Anweisung LOOP ab Commodore BASIC V3.5 oder höher.


Die Anweisung LOOP markiert das Ende einer DO-LOOP-Schleife. Der Befehl kann von einer Laufbedingung gefolgt sein, die nach jedem Durchlauf der Schleife geprüft wird. Ist die Laufbedingung erfüllt, wird die Startposition der Schleife (am BASIC-Stapel vermerkt) angesprungen. Ist auf dem BASIC-Stapel der korrespondierende Vermerk mit der DO-Position nicht vorhanden, wird mit Fehlermeldung ?LOOP WITHOUT DO ERROR abgebrochen.

Die Laufbedingung besteht aus einem der Schlüsselwörter UNTIL oder WHILE, gefolgt von einem beliebigen, auswertbaren BASIC-Ausdruck:

  • Bei UNTIL wird die Schleife ausgeführt, solange der Ausdruck logisch falsch ist.
  • Bei WHILE hingegen solange der Ausdruck logisch wahr ist.

Wie bei IF-THEN gilt das Ergebnis als wahr, wenn es ungleich 0 ist oder eine nichtleere Zeichenkette ergibt (mit dem selben ungewöhnlichen Verhalten).

Eine DO-LOOP-Schleife ist einer GOTO-Schleife stets vorzuziehen, da

  • sie aus Sicht der Laufzeit immer schneller ist, weil nämlich ein GOTO im Falle eines Sprungs zu kleineren Zeilennummern immer das entsprechende Ziel abhängig von der Zeilenanzahl vom Programmanfang beginnend "suchen" muss.
  • Schleifen unabhängig von der Position und Zeilennummerierung ist.
  • der Schleifenanfang nicht zwingend an einem Zeilenanfang liegen muss.


Aufbau einer DO-LOOP-Schleife

Formal ist eine DO-LOOP-Schleife folgendermaßen aufgebaut:

DO [UNTIL|WHILE <Bedingung1>]
...
[IF <Bedingung2> THEN EXIT]
...
LOOP [UNTIL|WHILE <Bedingung3>]

DO bildet den Kopf (Beginn), LOOP den Fuß (Abschluss) der Schleife. Zusätzlich ist ein vorzeitiges Verlassen der Schleife mit der Anweisung EXIT möglich.

DO und LOOP müssen paarweise benutzt werden, in einem Programm muss also zu jedem DO genau ein LOOP existieren. Ein zusätzliches LOOP als schneller Rücksprung zum Schleifenanfang (wie von NEXT bekannt) ist nicht zulässig: Zwar funktioniert so ein Rücksprung, aber wenn durch EXIT oder durch eine nicht erfüllte DO-Laufbedingung das Schleifen-beendende LOOP gesucht werden muss, würde der Interpreter das falsche finden und nutzen. Weiterhin müssen bei einer solchen Suche natürlich sämtliche inneren (geschachtelten) DO/LOOP-Schleifen ignoriert werden; auch dies funktioniert nur dann zuverlässig, wenn DO und LOOP paarweise vorhanden sind.

Beispiele[Bearbeiten | Quelltext bearbeiten]

100 T=TI:DO:GET K$:LOOP UNTIL K$<>"" OR TI>T+600

Wartet bis eine Taste gedrückt wird oder mehr als 10 Sekunden vergangen sind (einen etwaigen Überlauf des Timer-Wertes in TI vernachlässigend).


BASIC V2.0 Nachbildung

Am Beispiel von UNTIL:

100 DO
110 REM SCHLEIFENKOERPER
120 LOOP UNTIL BE

kann unter BASIC V2.0 wie folgt nachgebildet werden:

100 :
110 REM SCHLEIFENKOERPER
120 IF (BE)=0 GOTO 100

Diese Varianten hat allerdings die Einschränkung, dass sich der Schleifenbeginn nur an einem Zeilenanfang und das Schleifenende nur am Zeilenende befinden kann.

Ohne eine rückwärtsgerichtetes GOTO, also mit besserem Laufzeitverhalten und ohne Einschränkung der vorigen Version:

100 FOR BE=0 TO -1 STEP -1 
110 REM SCHLEIFENKOERPER
120 BE=(<Bedingung>) : NEXT

Solange der Ausdruck <Bedingung> nicht erfüllt ist und damit 0 als Ergebnis hat, wird die FOR-NEXT-Schleifenvariable zurückgesetzt und das NEXT führt zu einem neuerlichen Durchlauf.