Referenz - DIM
Syntax A:
DIM [SHARED] Variable1 AS Typ [= Ausdruck] [, _
Variable2 AS Typ [= einfacherAusdruck] [, _
...] ]
Syntax B:
DIM [SHARED] AS Typ Variable1 [= Ausdruck] [, _
Variable2 [= Ausdruck] [, _
...] ]
Syntax C:
DIM [SHARED] Array( [ [Startindex TO] Endindex [, _
[Startindex TO] Endindex] [, ...] ] ] ) AS Typ [ _
=> {Ausdruck [, Ausdruck [, _ ... ] ] } ]
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.
DIM dimensioniert Variablen und Arrays einer angegebenen Größe und eines angegebenen Typs. Ein
Array ist eine Gruppe aus mehreren Variablen desselben Typs, auf dessen einzelne Elemente über einen Index zugegriffen wird.
- 'Variable' und 'Array' sind die Namen von neuen, noch nicht verwendeten Variablen oder Arrays.
'SHARED' bewirkt, dass die Variable auch Unterprogrammen zugänglich ist.- 'AS Typ' gibt an, von welchem Typ die Variable sein soll. Auch FUNCTION oder SUB kann hier als Typ angegeben werden; siehe dazu
DYLIBLOAD. - 'Ausdruck' ist ein Ausdruck, der aus Konstanten, Variablen, Operatoren, Funktionen und Symbolen bestehen darf. Der Wert von 'Ausdruck' wird der dimensionierten Variable zugewiesen. Um die Elemente eines Arrays zu befüllen, werden die einzelnen Werte in {geschweifte Klammern} gesetzt und durch Kommata getrennt. Bei mehrdimensionalen Arrays müssen innerhalb der Klammern noch einmal geschweifte Klammern gesetzt werden (siehe Beispiel 2 unten). Außerdem ist es möglich, hier 'ANY' anzugeben, um festzulegen, dass die Variable nicht initialisiert werden soll; an der Speicherstelle verbleibt der 'Datenmüll', der im Speicher zurückgeblieben ist.
Seit FreeBASIC v.0.17 muss jeder Variablen mittels 'AS Typ' explizit ein Datentyp zugewiesen werden. Standarddatentypen (vgl.
DEFxxx) stehen nur noch in Dialektformen wie
-lang deprecated oder -lang qb zur Verfügung.
Einfache Variablen werden folgendermaßen dimensioniert:
DIM i AS INTEGER, s AS SINGLE
Sollen sehr viele Variablen desselben Typs gleichzeitig dimensioniert werden, dann bietet sich die Verwendung eines Arrays an. Mit folgendem Code wird der Speicherbereich für 1000
INTEGER-Werte zur Verfügung:
DIM height(1 TO 1000) AS INTEGER
Dadurch werden 1000 Speicherstellen für INTEGER-Zahlen reserviert, wobei der Index des ersten Elements 1 ist und der des letzten Elements 1000.
Wird bei der DIM-Anweisung der Startindex ausgelassen, so wird automatisch angenommen, dass der Startindex 0 ist (dieser Wert konnte bis FreeBASIC v0.16 durch
OPTION BASE geändert werden). Zur Reservierung von 1000 INTEGER-Werten kann daher auch folgendermaßen vorgegangen werden:
DIM height(999) AS INTEGER
Hier reichen die Indizes von 0 bis 999.
Um mehrdimensionale Arrays anzulegen, werden die Grenzen der einzelnen Dimensionen nacheinander angegeben. Folgender Code legt ein zweidimensionales Array mit 100 Zeilen und 51 Spalten an:
DIM zweidimensional (1 TO 100, 50)
Bis FreeBASIC v0.16 wurden Felder mit bis zu vier Dimensionen unterstützt, seit v0.16 sind achtdimensionale Felder zulässig.
Um nun auf die Einträge im Feld zuzugreifen, verwenden Sie die Syntax:
FeldName(Index [, Index [, ...] ])
Achtung: Die Verwendung eines Index, der außerhalb der mit DIM angegebenen Grenzen liegt, kann möglicherweise andere Programmdaten beeinflussen oder sogar zu einem Programmabsturz führen. Dieser Fehler tritt häufig nicht sofort auf, was eine Fehleranalyse erschwert. Der FreeBASIC-Compiler stellt den
Optionsschalter -exx zur Verfügung, um während des laufenden Programms die Gültigkeit der Array-Grenzen zu überprüfen.
Beispiel 1:
DIM feld (3) AS BYTE
DIM tabelle (2, 4) AS INTEGER
feld(0) = 10
feld(1) = -3
feld(2) = feld(0) + feld(1)
tabelle(0, 0) = 10
PRINT feld(2), tabelle(0, 0)
SLEEP
Soll bei der Dimensionierung der Variable sofort ein Wert zugewiesen werden, kann dies über die sogenannten Variablen-Initiatoren geschehen:
Beispiel 2: Variablen-Initiatoren
DIM a AS INTEGER = 5, b AS USHORT = 123
DIM AS STRING c = "hello world", d = "FreeBASIC" & CHR(13) & "free 32bit Compiler"
DIM AS INTEGER Array(1 TO 3, 2) => { {1, 2, 3}, _
{4, 5, 6}, _
{7, 8, 9} }
PRINT Array (3, 0)
SLEEP
Wird beim Anlegen eines Arrays die Werte sofort zugewiesen, dann kann der Endindex auch durch drei Punkte ... (
Auslassung bzw. Ellipsis) ersetzt werden. Die obere Grenze des Arrays wird dann anhand der angegebenen Werte ermittelt.
Beispiel 3: Array-Dimensionierung mit Ellipsis
DIM AS INTEGER wert(3 TO ...) = {1, 2, 3, 4, 5, 6, 7, 8, 9}
PRINT LBOUND(wert), UBOUND(wert) ' untere und obere Grenze anzeigen
SLEEP
Es können auch Felder unbekannter Größe erzeugt werden. Solche Felder können z.B. an Prozeduren übergeben werden, wo sie redimensioniert und befüllt werden. Dabei durften solche Felder unbekannter Größe bis FreeBASIC v0.16 nur auf Modulebene (d.h. nicht in SUBs und FUNCTIONs) verwendet werden; seit FreeBASIC v0.16 können Felder unbekannter Größe an jedem Programmpunkt erstellt werden. Ein dynamisches Array kann mit DIM ohne Angabe der Grenzen oder über
REDIM angelegt werden.
Beispiel 4: Dynamisches Array
DECLARE SUB FileList(Path AS STRING, Array() AS STRING)
DIM AS STRING Files() ' dynamisch
FileList ENVIRON("TMP"), Files()
SUB FileList(Path AS STRING, Array() AS STRING)
DIM AS STRING filename
DIM AS INTEGER i
#IF __FB_PCOS__
filename = DIR(Path & "\*.*") ' Windows-Pfadangabe
#ELSE
filename = DIR(Path & "/*") ' Linux-Pfadangabe
#ENDIF
IF LEN(filename) THEN
REDIM Array(0) AS STRING ' neu dimensionieren
Array(0) = filename
i = 1
ELSE
EXIT SUB
END IF
DO
filename = DIR()
IF LEN(filename) THEN
REDIM PRESERVE Array(i) AS STRING
Array(i) = filename
i += 1
ELSE
EXIT DO
END IF
LOOP
END SUB
PRINT UBOUND(Files)
FOR i AS INTEGER = 0 TO UBOUND(Files)
PRINT Files(i)
NEXT
SLEEP
Unterschiede zu QB:
- Wenn Sie Variablen als Indexzahl benutzen, müssen Sie das Feld mit REDIM dimensionieren oder DYNAMIC (Metabefehl) benutzen. Dies wird sich in Zukunft vielleicht ändern.
- FreeBASIC unterstützt Variablen-Initiatoren.
- Die alternative Syntax DIM AS Typ Variable (Syntax 2) 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.
- Die Auslassung (
...; Ellipsis) des Endindex eines Arrays ist neu in FreeBASIC.
Unterschiede zu früheren FreeBASIC-Versionen:
- Seit FreeBASIC v0.21 kann bei einem Arrays mit Initiatoren der Endindex durch eine Auslassung ersetzt werden.
- 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.
- Variablen-Initiatoren existieren seit FreeBASIC v0.13
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:
REDIM,
SHARED,
SCOPE,
STATIC (Anweisung),
COMMON,
DYNAMIC (Meta),
STATIC (Meta),
OPTION,
DYNAMIC (Schlüsselwort),
STATIC (Schlüsselwort),
ERASE,
CLEAR,
Datentypen,
Pointer,
Gültigkeitsbereich von Variablen
| Zusätzliche Informationen und Funktionen | ||||
|---|---|---|---|---|
|
||||





FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!
Versionen