REDIM

FreeBASIC-Referenz » Alphabetische Befehlsreferenz » R » 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: 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.

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:

Unterschiede zu früheren FreeBASIC-Versionen:

Unterschiede unter den FB-Dialektformen:

Siehe auch:
DIM, PRESERVE, SCOPE, DYNAMIC (Meta), STATIC (Meta), UBOUND, LBOUND