Blitz2D: Schleifen

Aus Wikibooks

Ohne Schleifen könnte ein Programm nur in der Reihenfolge ablaufen, wie es programmiert wurde. Dabei könnte man zwar Teile des Programms bei Bedarf überspringen, jedoch nicht zu Programmteilen zurück kehren, die bereits abgearbeitet wurden. Jedes Programm würde in sehr kurzer Zeit sein Ende erreichen und müsste erneut gestartet werden, um wieder den Startbereich zu erreichen. Mit Schleifen kann man jedoch einzelne Programmteile, oder das ganze Programm beliebig oft wiederholen, bis eine Abbruchbedingung erfüllt ist. Es ist jedoch möglich, jede Schleife mit den Anweisungen If und Goto zu simulieren, was im Compiler tatsächlich auch gemacht wird, jedoch durch die Schleifen wird ein Programmcode übersichtlicher und besser lesbar (dadurch weniger Fehleranfällig). Eine weitere Verbesserung der Lesbarkeit des Programmcodes erzielt man durch Einrücken der Anweisungen innerhalb der Schleife.

For-Next-Schleife[Bearbeiten]

Die erste Schleife, die es bei Blitzbasic gab, ist die For-Next-Schleife. Diese Schleife gab es in der gleichen Form bereits im C64er Basic.

Beschreibung[Bearbeiten]

Nach der For-Anweisung wird ein numerische Variable (Integer oder Float) mit einem Startwert initialisiert, dann wird nach dem Keyword To ein Endwert angegeben. Optional kann auch noch nach dem Keyword Step eine Schrittweite festgelegt werden, um die die Variable bei jedem Durchlauf erhöht wird. Wird Step weggelassen, beträgt die Schrittweite 1. Für Startwert und Endwert können auch Variablen angegeben werden, die Schrittweite muss jedoch eine Konstante sein.

Funktionsweise[Bearbeiten]

In der For-Anweisung wird nur der Startwert in die Variable kopiert, dann werden alle folgenden Anweisungen bis zur Next-Anweisung ausgeführt. Next erhöht zuerst die Variable um die Schrittweite und prüft erst danach, ob der Inhalt der Variablen größer als der Endwert ist. Ist das der Fall, ist die Schleife beendet, anderenfalls wird zu der ersten Anweisung nach 'For' gesprungen und die Schleife erneut ausgeführt. Die Forschleife wird also mindestens einmal durchlaufen, da auf Überschreitung des Endwertes erst bei 'Next' getestet wird.

Simulation[Bearbeiten]

Zuerst eine normale For-Next-Schleife

For Wert=Start To Ende Step Schritt
   <weitere Anweisungen>
Next

Die gleiche Schleife simuliert

Wert=Start         ;Die initialisierung der Zählvariablen mit dem Startwert simuliert "For"
.Sprungziel  ;Hier ist die Einsprungposition für weitere Durchläufe
   <weitere Anweisungen>
Wert=Wert+Schritt      ;"Next" erhöht immer erst die Zählvariable um die Schrittweite
If Sgn(Wert-Ende)<>Sgn Schritt Goto Sprungziel ;danach wird geprüft, ob die Schleife erneut durchlaufen wird

mögliche Fehler[Bearbeiten]

  • Die For-Next-Schleife wird normalerweise mit einer vom Programmierer festgelegten Anzahl an Durchläufen ausgeführt. Da es aber möglich ist, die Zählvariable innerhalb der Schleife zu verändern, kann die Anzahl der Durchläufe davon deutlich abweichen. Wenn sogar der Zählvariablen innerhalb der Schleife ein konstanter Wert zugewiesen wird, wird die Schleife endlos weiter laufen.
  • Für den Startwert und den Endwert können auch Variablen verwendet werden, deren Veränderung in der Schleife oder auch außerhalb der Schleife (wenn die For-Next-Schleife in einer anderen Schleife verschachtelt ist) zu unerwünschten Aktionen führen. Dabei ist es auch möglich, dass ein Fehler erst später auftritt und man deshalb die Fehlerursache nicht in der Schleife sucht.

For-Each-Next-Schleife[Bearbeiten]

Diese Schleife dient zum Durchlaufen aller Typeobjekte eines Types. In der aktuellen Form können nur alle Objekte, aber nicht ein bestimmter Bereich durchlaufen werden.

Beschreibung[Bearbeiten]

Nach „For“ wird eine Typezeigervariable angegeben, die in jedem Schleifendurchlauf auf das aktuelle Objekt zeigt. Danach folgt ein = und das Keyword „Each“, sowie der Name der Typeliste, deren Objekte durchlaufen werden sollen.

Funktionsweise[Bearbeiten]

Bei erreichen von For <Typezeiger> wird der Typezeiger mit dem ersten Objekt der Typeliste initialisiert. Bei erreichen von „Next“ wird erst der Typezeiger auf das nächste Objekt gesetzt und dann überprüft, ob er „Null“ enthält. Ist das nicht der Fall, so wird zu der Anweisung hinter „For“ gesprungen und so die Schleife erneut ausgeführt.

Simulation[Bearbeiten]

Zuerst eine normale For-Each-Next-Schleife:

For <Typezeiger> = Each <Typename>
   <weitere Anweisungen>
Next

Die gleiche Schleife simuliert

<Typezeiger> = First <Typename>
.Sprungziel  ;Hier ist die Einsprungposition für weitere Durchläufe
   <weitere Anweisungen>
<Typezeiger> = After <Typezeiger>
If <Typezeiger> <> Null Goto Sprungziel

Mit der simulierten Schleife ist es auch möglich, nur einen bestimmten Bereich von <Startobjekt> bis <Endobjekt> zu durchlaufen, oder eine Typeliste vom Ende zum Anfang zu durchlaufen, was mit der normalen For-Each-Next-Schleife nicht möglich ist.

<Typezeiger> = <Startobjekt>
.Sprungziel
   <weitere Anweisungen>
<Typezeiger> = After <Typezeiger>
if <Typezeiger> = Null Goto Schleifenende ;dieser Sprung wird nur erreicht, wenn <Endobjekt> vor <Startobjekt> liegt
If <Typezeiger> <> After <Endobjekt> Goto Sprungziel
.Schleifenende

mögliche Fehler[Bearbeiten]

Die For-Each-Next-Schleife ist sehr sicher und fehlerunanfällig. Das aktuelle Objekt, oder auch jedes andere Objekt der Liste kann während der Schleife beliebig verändert, verschoben oder auch gelöscht werden, ohne dass es dadurch zu Fehlern kommt. Daher ist es mit Verschieben von Objekten sehr einfach möglich, einige Objekte zu überspringen oder mehrfach zu durchlaufen.

Repeat-Until-Schleife[Bearbeiten]

While-Wend-Schleife[Bearbeiten]

Die Exit-Anweisung[Bearbeiten]

Repeat-Forever-Schleife[Bearbeiten]

Beschreibung[Bearbeiten]

Die Repeat-Forever-Schleife verwendet keinerlei Variablen, der Programmteil zwischen „Repeat“ und „Forever“ wird unendlich oft ausgeführt. Daher kann diese Schleife nur mit „Exit“ verlassen werden.

Funktionsweise[Bearbeiten]

Wie bei „Repeat-Until“ bestimmt „Repeat“ nur das Sprungziel für weitere Schleifendurchläufe. Im Gegensatz zu „Until“ wird bei „Forever“ jedoch keine Bedingung geprüft, sondern immer zu der Anweisung nach „Repeat“ zurück gesprungen. Die Schleife kann nur mit „Exit“ verlassen werden, dabei bleibt es aber dem Programmierer überlassen, an welcher Stelle innerhalb der Schleife nach Überprüfung einer Abbruchbedingung die Schleife verlassen werden soll. Es können auch verschiedene, voneinander unabhängige Abbruchbedingungen an unterschiedlichen Stellen innerhalb der Schleife vorkommen, dadurch ist „Repeat-Forever“ besonders flexibel verwendbar.