Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - DIM

Referenz-Navigation

 

Syntax A:

DIM [SHARED] Variable1 AS Typ [= Ausdruck] [, _
             Variable2 AS Typ [= Ausdruck] [, _
             ...] ]

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: 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 letzt­end­lich keine Auswirkungen auf die Programmausführung.

DIM dimensioniert Variablen und Arrays einer angegebenen Größe und eines angegebenen Typs. Ein Externer Link!Array ist eine Gruppe aus mehreren Variablen desselben Typs, auf dessen einzelne Elemente über einen Index zugegriffen wird.

Jeder Variablen muss mittels 'AS Typ' explizit ein Datentyp zugewiesen werden. Standarddatentypen (vgl. BefehlsreferenzeintragDEFxxx) stehen nur in Dialektformen wie Befehlsreferenzeintrag-lang deprecated oder -lang qb zur Verfügung.

Für die Verwendung eines Initiators 'Ausdruck' kann neben dem Gleichheitszeichen = auch die Schreibweise => verwendet werden. Wird kein Initiator verwendet, so wird der Standardkonstruktor des Datentyps verwendet: Zahlen und BefehlsreferenzeintragPointer werden auf 0 gesetzt, BefehlsreferenzeintragSTRINGs auf den Leerstring "". Bei BefehlsreferenzeintragUDTs wird in diesem Fall der Konstruktor ohne Parameterliste aufgerufen. Wenn kein Konstruktor existiert, wird für jeden Record der Standardkonstruktor aufgerufen.

Es ist auch möglich, als 'Ausdruck' BefehlsreferenzeintragANY anzugeben, um festzulegen, dass die Variable nicht initialisiert werden soll; an der Speicherstelle verbleibt der 'Datenmüll', der im Speicher zurückgeblieben ist.

Einfache Variablen werden folgendermaßen dimensioniert:

DIM i AS INTEGER, s AS SINGLE

Sollen mehrere Variablen desselben Typs dimensioniert werden, lässt sich das mit Syntax B einfacher bewerkstelligen:

DIM AS INTEGER a, b, c, d, e

Arrays
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 BefehlsreferenzeintragINTEGER-Werte zur Verfügung gestellt:

DIM hoehe(1 TO 1000) AS INTEGER
' oder auch
DIM AS INTEGER breite(1 TO 1000)

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. Zur Reservierung von 1000 INTEGER-Werten kann daher auch folgendermaßen vorgegangen werden:

DIM hoehe(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 AS INTEGER zweidimensional (1 TO 100, 50)

Um nun auf die Einträge im Feld zuzugreifen, verwenden Sie die Syntax:

FeldName(Index [, Index [, ...] ])

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

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 BefehlsreferenzeintragOptionsschalter -exx zur Verfügung, um während des laufenden Programms die Gültigkeit der Array-Grenzen zu überprüfen.


Initialisierung
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 Compiler"

'Alternativ:   Array(1 TO 3, 0 TO 3) ...
DIM AS INTEGER Array(1 TO 3, 3) = { {1, 2, 3, 4}, _
                                    {5, 6, 7, 8}, _
                                    {9,10,11,12} }
PRINT Array (3, 0)     'gibt 9 aus
SLEEP

Wird beim Anlegen eines Arrays die Werte sofort zugewiesen, dann kann der Endindex auch durch drei Punkte ... (BefehlsreferenzeintragAuslassung 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

Dynamische Arrays
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. Ein dynamisches Array kann mit DIM ohne Angabe der Grenzen oder über BefehlsreferenzeintragREDIM angelegt werden; dadurch wird auch die Anzahl der Dimensionen noch offen gelassen. Soll die Anzahl der Dimensionen festgelegt werden, wird statt 'Startindex TO Endindex' das Schlüsselwort ANY angegeben.

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

Um mögliche Problem mit einer falschen Dimensionenzahl bei der Array-Übergabe zu vermeiden, kann ANY verwendet werden:

DECLARE SUB FileList(Path AS STRING, Array(ANY) AS STRING)
DIM AS STRING Files1(ANY)       ' dynamisch, eine Dimension
DIM AS STRING Files2(ANY, ANY)  ' dynamisch, zwei Dimensionen

Eine Übergabe vom files1() an die Prozedur ist nun möglich, da die Dimensionenzahl übereinstimmt. files2() dagegen kann nicht an die Prozedur übergeben werden.

Unterschiede zu QB:

Unterschiede zu früheren Versionen von FreeBASIC:

Unterschiede unter den FB-Dialektformen:

Siehe auch:
BefehlsreferenzeintragREDIM, BefehlsreferenzeintragSHARED, BefehlsreferenzeintragSCOPE, BefehlsreferenzeintragSTATIC (Anweisung), BefehlsreferenzeintragCOMMON, BefehlsreferenzeintragDYNAMIC (Meta), BefehlsreferenzeintragSTATIC (Meta), BefehlsreferenzeintragOPTION, BefehlsreferenzeintragDYNAMIC (Schlüsselwort), BefehlsreferenzeintragSTATIC (Schlüsselwort), BefehlsreferenzeintragERASE, BefehlsreferenzeintragCLEAR, BefehlsreferenzeintragLBOUND, BefehlsreferenzeintragUBOUND, BefehlsreferenzeintragDatentypen, BefehlsreferenzeintragPointer, BefehlsreferenzeintragGültigkeitsbereich von Variablen


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 17.07.2007 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 07.04.2015 von Redakteurnemored gespeichert.
  Versionen Versionen