BlitzBasic: Goto

Aus Wikibooks

Syntax[Bearbeiten]

Goto label

Parameter[Bearbeiten]

label : Eine Zeile im Programmcode, die nur .label enthält

Rückgabe[Bearbeiten]

keine

Beschreibung[Bearbeiten]

Mit »Goto« springt das Programm an die Zeile, die mit .label markiert ist.

Hinweise[Bearbeiten]

  • »Goto« ist eine der ältesten Anweisungen in Blitzbasic. Es gab sie schon als "Goto zeilennummer" im C64-Basic, wo jede Code-Zeile nummeriert war.
  • Sprünge, die im Code vor Goto liegen, waren eine einfache Form von Schleifen. Jeder neuere Schleife lässt sich aber durch eine entsprechende Kombination von »If« und »Goto« ersetzen.
  • Die meisten Verwendungen von »Goto« können durch neuere Anweisungen ersetzt werden, wodurch der Programm-Code übersichtlicher und dadurch weniger fehleranfällig wird.

Beispiele[Bearbeiten]

Schleife Simulation mit If und Goto
Repeat-Forever ist eine direkte Umsetzung eines Rückwärtssprung mit Goto
Repeat setzt nur den Einsprungpunkt, zu dem Forever zurück springt
Repeat
  ... (weitere Anweisungen)
Forever
Das Gleiche wird mit .Label und Goto Label erreicht
.Label
  ... (weitere Anweisungen)
Goto Label
Repeat-Until ist ähnlich, nur das eine Bedingung entscheidet ob ein Rücksprung erfolgt.
Until springt nur bei falscher Bedingung
Repeat
  ... (weitere Anweisungen)
Until (Bedingung)
Das lässt sich mit "If (Bedingung) Else Goto" simulieren
.Label
  ... (weitere Anweisungen)
If (Bedingung) Else Goto Label
While-Wend prüft die Bedingung vor der Schleife und kann dadurch auch gar nicht durchlaufen werden.
While führt die Schleife nur aus, solange die Bedingung wahr ist. andernfalls wird nach Wend weiter gemacht.
While (Bedingung)
  ... (weitere Anweisungen)
Wend
Hier braucht man 2x Goto. Das erste Goto springt wiederum nur, wenn die Bedingung falsch ist nach Label1, während das zweite Goto immer zu Label2 springt.
.Label2
If (Bedingung) Else Goto Label1
  ... (weitere Anweisungen)
Goto Label2
.Label1
For-Next zählt eine Variable vom Startwert zum Endwert in Schritten von +1 pro Durchlauf, hat daher also eine vorbestimmte Anzahl von Durchläufen wenn Zahlen verwendet werden, aber für Startwert und Endwert sind auch Variablen möglich. Jedoch mindestens einen Durchlauf, wenn der Endwert kleiner oder gleich dem Startwert ist. Darum ist nach For-Next die Variable immer größer als der Endwert.
Die Aussage in manchen Foren, das nach For-Next die Variable um 1 höher ist als der Endwert, trifft nur zu wenn eine Integer-Variable verwendet wird, oder wenn bei einer Float-Variablen Startwert und Endwert den gleichen Nachkommaanteil haben.
For setzt nur die Variable auf den Startwert. Next erhöht erst die Variable um 1 und vergleicht sie dann mit dem Endwert. Nur wenn die Variable kleiner oder gleich dem Endwert ist, wird an die erste Anweisung nach For verzweigt.
For (Variable)=(Startwert) To (Endwert)
  ... (weitere Anweisungen)
Next
For wird nur durch die Zuweisung des Startwerts an die Variable und den Einsprungpunkt ersetzt. Anstelle von Next wird erst die Variable erhöht und dann mit dem Endwert verglichen.
(Variable)=(Startwert)
.Label
  ... (weitere Anweisungen)
(Variable)=(Variable)+1
If (Variable)<=(Endwert) Goto Label
For-Step-Next sieht ähnlich aus wie For-Next, bietet jedoch durch Einstellung der Schrittweite mehr Möglichkeiten. Mit Step kann man den Wert einstellen, der in jedem Schleifendurchlauf zu der Variablen addiert wird. Es sind nicht nur ganze Zahlen, sondern auch Float-Werte und negative Zahlen möglich, um beispielsweise von einem Startwert zu einem geringeren Endwert herunter zu zählen. Allerdings kann der Parameter von Step keine Variable, sondern nur eine Konstante sein.
For setzt nur die Variable auf den Startwert. Next erhöht erst die Variable um 1 und vergleicht sie dann mit dem Endwert. Nur wenn die Variable kleiner oder gleich dem Endwert ist, wird an die erste Anweisung nach For verzweigt.
For (Variable)=(Start) To (Ende) Step (Schritte)
  ... (weitere Anweisungen)
Next
For wird nur durch die Zuweisung des Startwerts an die Variable und den Einsprungpunkt ersetzt. Anstelle von Next wird erst die Variable erhöht und dann mit dem Endwert verglichen.
(Variable)=(Start)
.Label
  ... (weitere Anweisungen)
(Variable)=(Variable)+(Schritte)
If (Variable)<=(Abs(Ende)) Goto Label
For-Each-Next ist eine weitere Form von For-Next. Hier wird jedoch ein Typezeiger in jedem Durchlauf der Schleife auf einen Eintrag einer Type-Liste gesetzt, so dass man alle Einträge in einer Schleife durchlaufen kann.
In manchen Foren wird behauptet, dass man entweder mit Typezeigern auf einzelne Einträge, oder mit For-Each-Next auf alle Einträge zugreifen könne, was bei sehr vielen Einträgen lange dauern kann. Das ist jedoch falsch! Man kann auch Type-Listen mit anderen Schleifen, oder If / Goto durchlaufen und dabei nur einen Teil der Einträge durchlaufen.
For lädt wieder nur den Typezeiger mit dem ersten Eintrag. In Next wird erst der Typezeiger auf den nächsten Eintrag gesetzt und danach geprüft, ob der Typezeiger Null enthält. Wenn nicht, wird hinter For gesprungen.
For (Typezeiger)=Each Typename
  ... (weitere Anweisungen)
Next
Da nach Last Typename nur Null kommt, kann auf Null getestet werden. (Ein Test auf Last Typename würde die Schleife nicht mit dem letzten Eintrag durchlaufen.
(Typezeiger)=First Typename
.Label
  ... (weitere Anweisungen)
(Typezeiger)=After (Typezeiger)
If (Typezeiger)=Null Else Goto Label