LOOP (BASIC 3.5)
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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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.
AUTO | BACKUP | BOX | CHAR | CIRCLE | COLLECT | COLOR | COPY | DEC | DELETE | DIRECTORY | DLOAD | DO | DRAW | DS | DS$ | DSAVE | EL | ELSE | ER | ERR$ | EXIT | GETKEY | GRAPHIC | GSHAPE | HEADER | HELP | HEX$ | INSTR | JOY | KEY | LOCATE | LOOP | MONITOR | PAINT | PRINT USING | PUDEF | RCLR | RDOT | RENAME | RENUMBER | RESUME | RGR | RLUM | SCALE | SCNCLR | SCRATCH | SOUND | SSHAPE | TRAP | TROFF | TRON | UNTIL | VOL | WHILE