NEXT
NEXT | |
Syntax: | NEXT [<Variable1>][,<Variable2>]… |
Parameter | |
<Variable1>: Innerste Schleifenvariable | |
<Variable2>: Nächst äußere Schleifenvariable | |
Einordnung | |
Typ: | Anweisung |
Kontext: | Programmstruktur |
Aufgabe: | Markiert das Ende einer FOR-NEXT-Schleife |
Abkürzung: | nE |
Token: | $82 (130) |
Verwandte Befehle | |
FOR, STEP, TO |
Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl NEXT unter BASIC V2 des Commodore 64.
Der BASIC-Befehl NEXT dient dazu, das Ende einer FOR…TO…STEP…NEXT-Konstruktion (kurz FOR-NEXT-Schleife) zu markieren und ist immer gemeinsam mit seinem Gegenstück, dem BASIC-Befehl FOR zu verwenden. Die Angabe der Schleifenvariable, auch als Lauf- oder Zählvariable bezeichnet, ist beim NEXT-Befehl nicht zwingend erforderlich. Jede begonnene FOR-NEXT-Schleife benötigt ein abschließendes NEXT, das aber durchaus an mehreren Stellen vorkommen darf, solange es entsprechend passend durchlaufen wird.
Erfolgt ein NEXT ohne Variablenangabe wird jene Schleifenvariable herangezogen, die dem zuletzt passierten FOR-Befehl zugehörig ist.
Ein unerwarteter Aufruf eines NEXT führt zur BASIC-Fehlermeldung ?NEXT WITHOUT FOR ERROR. Auslöser dafür können sein: Ein NEXT wird ohne vor dem zugehörigen FOR durchlaufen oder es ist noch ein GOSUB offen (welches am Stapel die Verwaltungsinformation des dazugehörigen FOR verdeckt bzw. sperrt) oder die Reihenfolge der auf NEXT folgenden Schleifenvariablenaufzählung ist falsch.
Beim Erreichen des BASIC-Befehls NEXT wird erst die Schleifenvariable der FOR-NEXT-Schleife um 1 oder um die bei STEP angegebene Schrittweite erhöht bzw. erniedrigt (wenn negativ) und dann die Endbedingung überprüft (siehe Details). Ist diese erfüllt, wird die Schleife verlassen, nämlich dann, wenn die Schleifenvariable des NEXT-Befehls größer (bei negativer Schrittweite kleiner) als der vorgegebene Endwert nach dem TO des FOR…TO…-Befehls ist. Ausnahme ist der Fall mit Schrittweite 0, wo die Schleifenvariable nur in Übereinstimmung mit dem Endwert, die Endbedingung erfüllt.
Der Ausdruck für den Endwert wird dabei aber nur zu Beginn einmalig ausgewertet und dann für jeden Schleifendurchlauf herangezogen.
Tritt die Endbedingung nicht ein, verzweigt die Programmausführung zurück zum Schleifenanfang, also zu dem unmittelbar nach dem FOR…TO…-Befehl folgenden Programmteil.
FOR-NEXT-Schleifen dürfen ineinander verschachtelt werden. Ein NEXT ohne Variablenangabe schließt dann immer das "innerste" und nächstliegende FOR, sonst jenes mit der dazu passenden Schleifenvariable. Etwaige innere Schleifen werden dabei zwangsweise abgebrochen und der Stapel korrekt bereinigt. Damit ist auch das Anspringen eines "äußeren" NEXT mittels GOTO möglich, um innere Schleifen frühzeitig und korrekt zu beenden. Umgekehrt führt das Anspringen von "inneren" Schleifen beim entsprechenden NEXT zu ?NEXT WITHOUT FOR ERROR.
Zu viele ineinander verschachtelt FOR-NEXT-Schleifen führen zur BASIC-Fehlermeldung ?OUT OF MEMORY ERROR. Das Limit von theoretisch 10 Verschachtelungen bewegt sich in der Praxis im Bereich rund um 8 bis 9, je nach dem, wie komplex die in der innersten Schleife durchzuführende Aktionen sein sollen: Berechnungen in mehreren Klammerebenen oder verschachtelte Unterprogrammaufrufe beanspruchen nämlich zusätzlich Platz auf dem Stapelspeicher und schränken die Verschachtelungstiefe ein.
Eine Schleife mit GOTO zu verlassen, ohne ein NEXT zu durchlaufen, sollte vermieden werden. Passiert dies mit jeweils verschiedenen Schleifenvariablen entsprechend oft (spätestens beim 11. Mal), erscheint die BASIC-Fehlermeldung ?OUT OF MEMORY ERROR aufgrund eines Stapelüberlaufs (bedingt durch die offen gebliebenen FOR-NEXT-Schleifen)!
Eine solche Situation ist aber eher die Seltenheit, bei der nämlich Schleifen mit verschiedenen Schleifenvariablen irgendwie aufeinander folgend eröffnet werden müssten. Immer wenn eine Schleifenvariable erneut bei einem FOR verwendet wird, verwirft dieses alle zeitlich nach dieser Variablen geöffneten (weiter verschachtelten, "inneren") Schleifen, wobei der Stapel im korrekten Zustand bleibt. Des weiteren werden bei einem RETURN alle seit dem dazugehörenden GOSUB geöffneten FOR-Schleifen beendet.
Beispiele[Bearbeiten | Quelltext bearbeiten]
Einfache Schleifen[Bearbeiten | Quelltext bearbeiten]
10 FOR X=1 TO 15: PRINT X: NEXT X
Ausgabe der Zahlen 1 bis 15.
10 FOR X=1 TO 15: PRINT X: NEXT
Es geht auch ohne Variablen beim BASIC-Befehl NEXT.
Verschachtelung[Bearbeiten | Quelltext bearbeiten]
10 FOR X=1 TO 10 20 FOR Y=1 TO 10: PRINT X*Y;: NEXT: PRINT: NEXT
Es geht auch ohne Variablen beim BASIC-Befehl NEXT – Ausgabe des kleinen Einmaleins.
10 REM Farbspiele – !!! Achtung Epilepsiewarnung !!! – (w) by jodigi 2006 20 FOR X=0 TO 255 30 FOR Y=0 TO 255 40 POKE 53280,X: POKE 53281,Y 50 FOR A=0 TO 150: REM Zeitwert zur Verzögerung bitte anpassen 60 NEXT A,Y,X
3 Schleifen ineinander geschachtelt, immer die letzte Schleife zuerst schließen.
10 FOR I=1 TO 3 20 FOR J=1 TO 3 30 FOR K=1 TO 3 40 PRINT I,J,K 60 IF RND(1)>0.8 GOTO 80 : REM K+J SCHLEIFE ABBRECHEN 50 NEXT K 60 IF RND(1)>0.5 GOTO 80 : REM J-SCHLEIFE ABBRECHEN 70 NEXT J 80 NEXT I
Drei ineinander verschachtelte Schleifen mit einem zufallsgesteuerten Schleifenabbruch der inneren Schleifen durch direktes Anspringen des NEXT-Befehls der äußersten Schleife:
Die übersprungenen Schleifen werden dabei abgebrochen (der Stapel entsprechend korrekt aufgeräumt). Die I-Schleife könnte (zwischen Zeilen 10 und 20) anhand der Werte in den Variablen J und K auch feststellen, an welcher Stelle der Abbruch erfolgte.
Schleifen mit flexiblen Abbruchbedingungen[Bearbeiten | Quelltext bearbeiten]
10 FOR N=1 TO 1E17 20 PRINT N;".DURCHLAUF - ZAHL EINGEBEN (ENDE MIT 0)";:INPUT A$ 30 X=INT(VAL(A$)): PRINT "EINGEGEBENE ZAHL =";X 40 IF X=0 THEN N=1E18 50 NEXT N
Simulation einer unendlichen (unbeschränkten) Schleife (mit hochzählender Schleifenvariable N), die mit dem Trick in Zeile 40 korrekt verlassen bzw. abgebrochen werden kann. Vom Laufzeitverhalten üblicherweise deutliche schneller als eine GOTO-Schleife (bei größeren Programmen, natürlich erst dann, wenn im Schleifenkörper keine interaktive Komponente vorhanden ist).
Ersatzimplementierung[Bearbeiten | Quelltext bearbeiten]
Initialisierung für beide Varianten:
10 AW=0 20 EW=10 30 SW=3
FOR-NEXT-Variante:
100 FOR I=AW TO EW STEP SW 110 PRINT I 120 NEXT
Nachgebildet mittels IF, THEN, GOTO:
100 :I=AW : REM FOR ... 110 PRINT I 120 :I = I+SW : REM NEXT ... 121 :IF SGN(I-EW) <> SGN(SW) GOTO 110
Die allgemeingültige Implementierung, wie sie der BASIC-Interpreter verwendet, auch für negative Schrittweiten!
Weitere Beispiele[Bearbeiten | Quelltext bearbeiten]
Siehe auch BASIC-Befehl:
ABS | AND | ASC | ATN | CHR$ | CLOSE | CLR | CMD | CONT | COS | DATA | DEF | DIM | END | EXP | FN | FOR | FRE | GET | GET# | GOSUB | GOTO | IF | INPUT | INPUT# | INT | LEFT$ | LEN | LET | LIST | LOAD | LOG | MID$ | NEW | NEXT | NOT | ON | OPEN | OR | PEEK | POKE | POS | PRINT | PRINT# | READ | REM | RESTORE | RETURN | RIGHT$ | RND | RUN | SAVE | SGN | SIN | SPC | SQR | STATUS/ST | STEP | STOP | STR$ | SYS | TAB | TAN | THEN | TIME/TI | TIME$/TI$ | TO | USR | VAL | VERIFY | WAIT