Syntax:
REDIM [PRESERVE] [SHARED] ArrayName([[Untergrenze TO] Obergrenze] _
[, [Untergrenze TO] Obergrenze] _
[, ...]) [AS Datentyp] [, weitereArrays]
REDIM [PRESERVE] [SHARED] AS Datentyp ArrayName([[Untergrenze TO] Obergrenze] _
[, ...]) [, weitereArrays]
Typ: Anweisung
Kategorie: Speicherverwaltung
Anmerkung zur Syntax: Unterstriche (_) am Zeilenende werden von FreeBASIC so interpretiert, als wäre die Zeile nicht unterbrochen; dies dient nur der besseren Übersichtlichkeit und hat letztenendes keine Auswirkungen auf die Programmausführung.
REDIM erstellt ein dynamisches Array oder ändert dessen Größe.
- Wird 'PRESERVE' bei einem vorhandenen Array benutzt, bleibt der Inhalt des Arrays bei einer Größenänderung erhalten.
Beachten Sie, dass PRESERVE nicht mit mehrfach-dimensionierten Arrays funktioniert (siehe auch den Artikel zu PRESERVE). - 'SHARED' legt den gemeinsamen (shared) Zugriff für ein Array für das Modul fest (file-scope).
- 'ArrayName' ist der Name des Arrays, das erstellt oder dessen Größe geändert werden soll.
- 'Untergrenze' und 'Obergrenze' legen die Größe des Arrays fest. Wird 'Untergrenze' ausgelassen, dann verwendet FreeBASIC standardmäßig den Wert 0.
- 'Datentyp' gibt den Datentyp des Arrays an. Wurde das Array bereits zuvor definiert, dann kann 'AS Datentyp' weggelassen werden, oder der Datentyp muss mit dem bereits zuvor verwendeten identisch sein.
REDIM kann benutzt werden, um neue, in der Länge variable Arrays zu erstellen oder vorhandene Arrays dieser Art zu vergrößern. REDIM erstellt IMMER variable Arrays, also können, anders als bei DIM, variable Arrays mit konstanten Indizes erstellt werden.
Wird ein neues variables Array erstellt, dann werden die Element vom Default-Constructor erstellt. Bei einfachen Datatypen wie INTEGER oder DOUBLE werden sie mit Null (0) initialisiert, bei UDTs (user defined types) vom Default-Constructor, der dann aufgerufen wird.
Wenn REDIM benutzt wird, um ein Array erstmalig zu dimensionieren, bewirkt es, dass es als dynamisches Array erstellt wird, während DIM ein statisches Feld erstellt. Der Metabefehl '$DYNAMIC bzw. die Einstellung OPTION DYNAMIC unterbindet die Erstellung statischer Felder.
Achtung: '$DYNAMIC bzw. OPTION DYNAMIC steht nur bis FreeBASIC v0.16 zur Verfügung!
Wird die Größe eines variablen Arrays ohne den PRESERVE-Parameter geändert, werden alle Elemente zerstört und neue Elemente werden vom Default-Constructor erstellt. Mit dem PRESERVE-Parameter werden die vorhandenen Elemente nicht zerstört, außer, wenn das Array verkleinert wird: dann gehen zwangsläufig die abgetrennten Elemente verloren. Wird ein variables Array vergrößert, dann werden die neuen Elemente vom Default-Constructor am Ende des Arrays erstellt.
Beachte: Die Benutzung von REDIM in einer 'Member-Procedure' mit einem Array, das Instanzen der Objekt-Klasse enthält, ist undefiniert und wird [hoffentlich] einen fürchterlichen Programmabsturz zur Folge haben.
Achtung: REDIM kann NICHT bei Arrays benutzt werden, die zu UDTs gehören, da momentan nur Arrays mit fester Größe in UDTs unterstützt werden.
Beispiel 1:
DIM x() AS INTEGER
REDIM x(3)
PRINT UBOUND(x)
REDIM x(6)
PRINT UBOUND(x)
SLEEP
Beispiel 2:
' Array mit 5 Elementen anlegen
ReDim Array(1 To 5) As Integer
For index As Integer = LBound(Array) To UBound(Array)
Array(index) = index
Next
' Auf 10 Elemente vergrößern; dabei wird auch die untere Grenze verschoben
ReDim Preserve Array(9) As Integer
Print "Index", "Wert"
For index As Integer = LBound(Array) To UBound(Array)
Print index, Array(index)
Next
Ausgabe:
Index Wert
0 1
1 2
2 3
3 4
4 5
5 0
6 0
7 0
8 0
9 0
Unterschiede zu QB:
- Das Schlüsselwort 'PRESERVE' existiert nur in Visual Basic
- Die alternative Syntax DIM AS Typ Variable ist neu in FreeBASIC.
- Bei der Speicherung mehrdimensionaler Arrays folgen in FreeBASIC die Werte aufeinander, deren erster Index gleich ist. In QB folgen die Werte aufeinander, deren letzter Index gleich ist.
Unterschiede zu früheren FreeBASIC-Versionen:
- Seit FreeBASIC v0.17 muss der Typ explizit deklariert werden, außer das Programm wird mit der Option -lang deprecated compiliert.
- Seit FreeBASIC v0.16 dürfen Felder unbekannter Größe an jedem Programmpunkt, auch in Prozeduren, erstellt werden.
Unterschiede unter den FB-Dialektformen:
- In der Dialektform -lang qb und -lang fblite sind Variablen, die in einer Prozedur dimensioniert wurden, in der ganzen Prozedur sichtbar. Variablen, die mit 'SHARED' dimensioniert wurden, sind im ganzen Modul sichtbar.
- In der Dialektform -lang fb und -lang deprecated sind Variablen, die in einem Block dimensioniert wurden (FOR ... NEXT, WHILE ... WEND, DO ... LOOP, SCOPE ... END SCOPE) nur in diesem Block sichtbar.
- In der Dialektform -lang fb sind OPTION-Anweisungen (z. B. OPTION BASE, OPTION DYNAMIC) nicht erlaubt.
Siehe auch:
DIM, PRESERVE, SCOPE, DYNAMIC (Meta), STATIC (Meta), UBOUND, LBOUND