NEXT

Aus C64-Wiki
Wechseln zu: Navigation, Suche
NEXT
Format: 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
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]

Einfache Schleifen[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]

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]

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]

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]

Siehe auch BASIC-Befehl: