Referenz - FOR ... NEXT
Syntax:
FOR Variable [AS Typ] = Start TO Ende [STEP Schrittweite]
' Programmcode
NEXT [Variable]
Typ: Anweisung
Kategorie: Programmablauf
Die FOR-Schleife wiederholt den Codeblock zwischen FOR und NEXT, wobei eine Variable bei jedem Durchlauf um einen bestimmten Wert erhöht wird.
- 'Variable' ist die Zählvariable, deren Wert sich beim Schleifendurchlauf verändern soll. Es kann sich bei ihr um jeden Zahlen-Datentyp handeln.
- 'AS Typ' sorgt dafür, dass 'Variable' speziell für die Schleife neu angelegt wird. Diese Dimensionierung gehört dann zum SCOPE-Block der FOR-Schleife (vgl. Gültigkeitsbereich von Variablen).
- 'Start' ist der Startwert, welcher der Zählvariablen zu Beginn der Schleife zugewiesen wird.
- 'Schrittweite' gibt an, um welchen Wert die Zählvariable bei jedem Schleifendurchlauf verändert werden soll. Wird 'STEP Schrittweite' ausgelassen, dann wird die Zählvariable bei jedem Durchlauf um 1 erhöht.
- 'Ende' ist der Wert, bis zu dem die Zählvariable laufen soll. Wird dieser Wert erreicht, dann wird die Schleife noch ein letztes mal durchlaufen; wird der Wert überschritten (oder bei negativer Schrittweite unterschritten), dann wird die Schleife verlassen.
'Start' und 'Ende' werden zu Beginn der Schleife intern gespeichert und können innerhalb der Schleife nicht mehr geändert werden. Werden für 'Start' bzw. 'Ende' Variablen verwendet, dann können diese Variablen zwar in der Schleife geändert werden, dies beeinflusst jedoch nicht mehr den Start- bzw. Endwert der Schleife.
Achtung: Bei Ganzzahl-Datentypen ist es nicht möglich, bis zum höchstmöglichen Wert zu zählen (oder bis zum tiefstmöglichen bei negativer Schrittweite), da die Schleife nur verlassen wird, wenn die Zählvariable den Endwert überschreitet. Das tritt in diesem Fall jedoch nie ein. Wird beispielsweise versucht eine UBYTE-Variable von 0 bis 255 zählen zu lassen, wird die Schleife erst verlassen, wenn die Variable den Wert 256 oder höher erreicht. Den Wert 256 kann die UBYTE-Variable jedoch nicht speichern. Stattdessen wird sie nach 255 auf 0 zurückgesetzt und die Schleife läuft weiter.
Wenn Sie für 'Variable' einen Ganzzahlentyp und für 'Schrittweite' eine Fließkommazahl verwenden, dann wird 'Schrittweite' zuvor auf eine Ganzzahl gerundet. Ist 'Schrittweite' kleiner oder gleich 0.5, dann wird sie auf 0 abgerundet und damit eine Endlosschleife erzeugt.
Ist 'Schrittweite' positiv und 'Start' größer als 'Ende', dann wird die Schleife nicht durchlaufen. Dasselbe gilt für eine negative 'Schrittweite', wenn 'Start' kleiner ist als 'Ende'.
Als Block-Anweisung initialisiert die FOR-Schleife einen SCOPE-Block, der mit der Zeile NEXT endet. Wird die Zählvariable mit 'AS Typ' neu dimensioniert, dann ist sie ebenfalls außerhalb der Schleife nicht mehr gültig.
Eine FOR-Schleife kann 'manuell' mit der Anweisung EXIT FOR abgebrochen werden. Taucht innerhalb des Schleifen-Codes die Anweisung CONTINUE FOR auf, so ignoriert FreeBASIC den Code bis zum nächsten NEXT und springt zurück zur FOR-Zeile. Die Zählvariable wird dabei um 'Schrittweite' erhöht.
FOR, STEP und NEXT können mithilfe von OPERATOR überladen werden. Zum Einsatz von UDTs als Zählvariable siehe den Tutorial-Beitrag zum Überladen von Iteratoren.
Beispiel 1: gibt ein Dreieck aus Sternen aus
DIM AS INTEGER i, hoehe
hoehe = 10
FOR i = 1 TO hoehe
PRINT STRING(i, "*")
NEXT
PRINT "Nach der Schleife hat i den Wert "; i
SLEEP
Ausgabe:
*
**
***
****
*****
******
*******
********
*********
**********
Nach der Schleife hat i den Wert 11
Erläuterung zu Beispiel 1: Nach dem zehnten Durchlauf wird die Zählvariable ein weiteres Mal erhöht und ihr Wert anhand der Schleifenbedingung überprüft. Da sie nun den Wert 11 besitzt, wird die Schleife verlassen.
Beispiel 2: Zählschleife mit automatischer Initialisierung
DIM i AS INTEGER = 1357
PRINT "Wert von i vor der Schleife: "; i
PRINT "Zähle von 3 bis 0 in Schritten von -0.2:"
FOR i AS SINGLE = 3 TO 0 STEP -0.2
PRINT "i = "; i
NEXT
PRINT "Wert von i nach der Schleife: "; i
SLEEP
Erläuterung zu Beispiel 2: Nach Beendigung der Schleife wird die Zählvariable zerstört; die außerhalb der Schleife deklarierte Variable existiert weiterhin und es kann nun wieder auf sie zugegriffen werden.
Beachten Sie in diesem Beispiel auch die auftretenden Rundungsungenauigkeiten. Es ist besser, Zählvariablen vom Typ INTEGER einzusetzen und diese ggf. innerhalb der Schleife umzurechnen.
FOR in Prozeduren kann nicht mit Variablen als Zähler verwendet werden, die BYREF übergeben wurden. Das liegt daran, dass bei BYREF intern ein Pointer übergeben wird und dieser nicht als Zählvariable eingesetzt werden kann.
Beispiel 3: ergibt einen Compilier-Fehler
DECLARE SUB foo (BYREF a As Integer)
DIM a AS INTEGER
foo a
SLEEP
SUB foo(BYREF a AS INTEGER)
FOR a = 1 TO 100
NEXT a
END SUB
Alternativ kann in der Prozedur eine neue Variable angelegt werden:
SUB foo (BYREF a AS INTEGER)
DIM b AS INTEGER = a
FOR b = 1 TO 100
NEXT
a = b
END SUB
Die hinter NEXT angegebene (optionale) Variable muss mit der bei FOR angegebenen Zählvariablen übereinstimmen. Es ist auch möglich, mehrere Zählvariablen hintereinander anzugeben, um mehrere FOR-Schleifen gleichzeitig abzuschließen.
Beispiel 4:
FOR i AS INTEGER = 1 TO 3 : FOR k AS INTEGER = 7 TO 9
PRINT i, k
NEXT k, i
SLEEP
Unterschiede zu QB:
- FreeBASIC erlaubt als Zählvaribale keine mit BYREF übergebene Variable.
- In QB dürfen innerhalb einer Schleife keine Variablen definiert werden.
- Die Syntax FOR Variable AS Typ = ... ist neu in FreeBASIC.
Unterschiede zu früheren Versionen von FreeBASIC:
- Seit FreeBASIC v0.18.3 muss die Variable hinter NEXT (sofern angegeben) der Schleifenvariablen entsprechen.
- Seit FreeBASIC v0.17 kann FOR seine Zähler-Variable über die Syntax FOR Variable AS TYP = ... automatisch initialisieren.
- Seit FreeBASIC v0.16 wirkt eine FOR-Schleife wie ein SCOPE-Block.
Unterschiede unter den FB-Dialektformen:
- In der Dialektform -lang qb und -lang fblite sind Variablen, die innnerhalb einer FOR-Schleife dimensioniert werden, in der ganzen Funktion sichtbar.
- In der Dialektform -lang fb und -lang deprecated sind Variablen, die in einer FOR-Schleife dimensioniert wurden, nur innerhalb dieser Schleife gültig.
Siehe auch:
DO...LOOP, WHILE...WEND, CONTINUE, SCOPE, EXIT, Schleifen
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|