DO (BASIC 3.5)

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

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl DO ab Commodore BASIC V3.5 oder höher.


Die Anweisung DO markiert den Beginn einer DO-LOOP-Schleife. Der Befehl kann von einer Laufbedingung gefolgt sein, die vor jedem Durchlauf der Schleife geprüft wird. Ist die Laufbedingung nicht erfüllt, wird das Programm nach dem nächsten gefundenen LOOP-Befehl fortgesetzt. Falls das abschließende LOOP fehlt, wird die Fehlermeldung ?LOOP NOT FOUND ERROR ausgegeben.

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-LOOP-Schleifen dürfen geschachtelt werden, wobei für jedes DO eine Struktur bestehend aus 5 Byte auf dem BASIC-Stapel abgelegt wird:

  • High-Byte/Low-Byte der aktuellen Zeilennummer,
  • High-Byte/Low-Byte der Adresse unmittelbar nach dem DO,
  • das DO-Token 235 als Kennung.

Somit sind theoretisch bis zu 39 (BASIC 3.5) bzw. 102 (BASIC 7.0) Verschachtelungen möglich. Zu viele ineinander verschachtelte DO-LOOP-Schleifen führen zu einem ?OUT OF MEMORY ERROR. Für jedes öffnende DO muss auch ein schließendes LOOP vorhanden sein, sonst kommt es zu einem Volllaufen des BASIC-Stapels.

Beispiele[Bearbeiten | Quelltext bearbeiten]

DO:J=JOY(1):LOOP UNTIL J

In diesem Beispiel wird die Schleife solange ausgeführt, bis der Joystick in Port 1 bewegt bzw. dessen Feuerknopf gedrückt wird.

10 I=1
20 DO:PRINT I,PEEK(124)+256*PEEK(125):I=I+1:GOTO 20

In diesem Programm werden solange DOs verschachtelt, bis es zu einem ?OUT OF MEMORY ERROR kommt. Ausgegeben wird für jeden Durchlauf die Schachtelungstiefe und die Untergrenze des BASIC-Stapels (die PEEK-Adressen gelten für für die C264-Rechner, für den C128 lauten die Adressen 125/126).

BASIC V2.0 Nachbildung

Am Beispiel von WHILE:

100 DO WHILE BE
110 REM SCHLEIFENKOERPER
120 LOOP

kann unter BASIC V2.0 wie folgt nachgebildet werden:

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

oder ohne rückwärtsgerichtetes GOTO, also mit besserem Laufzeitverhalten:

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

Diese Varianten haben allerdings die Einschränkung, dass sich der Schleifenbeginn und das Schleifenende jeweils stets nur an einem Zeilenanfang befinden kann.