Referenz - REDIM
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: Deklaration
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 letztendlich 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. Es können bis zu acht Dimensionen verwendet werden.
- Statt 'Untergrenze TO Obergrenze' kann auch für alle Dimensionen ANY angegeben werden, um die Anzahl der Dimensionen festzulegen, die Array-Größe aber noch offen zu lassen.
- '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 Elemente vom Default-Konstruktor erstellt. Bei einfachen Datatypen wie INTEGER oder DOUBLE werden sie mit Null (0) initialisiert, bei UDTs 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.
Wird die Größe eines variablen Arrays ohne den PRESERVE-Parameter geändert, werden alle Elemente zerstört und neue Elemente werden vom Default-Konstruktor erstellt. Mit dem Parameter PRESERVE 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-Konstruktor am Ende des Arrays erstellt.
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
Sleep
Ausgabe:
Index Wert
0 1
1 2
2 3
3 4
4 5
5 0
6 0
7 0
8 0
9 0
Beispiel 3: Anzahl der Dimensionen mit ANY festlegen
REDIM AS INTEGER a() ' Dimensionenzahl nicht festgelegt
REDIM AS INTEGER b(ANY) ' eine Dimensionen
REDIM AS INTEGER c(ANY, ANY, ANY) ' drei Dimensionen
Unterschiede zu QB:
- Das Schlüsselwort 'ANY' zur Festlegung der Zahl der Dimensionen ist neu in FreeBASIC.
- Das Schlüsselwort 'PRESERVE' existiert nur in Visual Basic
- Die alternative Syntax REDIM 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 Versionen von FreeBASIC:
- Die Verwendung von ANY zur Festlegung der Dimensionen existiert seit FreeBASIC v1.00.
- Dynamische Arrays in UDTs sind seit FreeBASIC v1.00 erlaubt.
- Seit FreeBASIC v0.17 muss der Typ explizit deklariert werden, außer das Programm wird mit der Option -lang deprecated compiliert.
- Seit FreeBASIC v0.17 ist es nicht mehr möglich, mit dem Metabefehl '$DYNAMIC bzw. der Einstellung OPTION DYNAMIC die Erstellung statischer Felder zu unterbinden.
- 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, Arrays
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|