Name
DIM

Syntax
DIM var1[[zeile1]] [, var2[[zeile2]], ... varn[[zeilen]]]
oder
DIMvar1[[zeile1]][[spalte1]] [, var2[[zeile2]][[spalte2]], ... varn[[zeilen]][[spalten]]]

Aufklappen Wertebereiche
vari, Zulässiger Variablenname
zeilei>0, Typ integer; Zahlenwert, kein Ausdruck; Ab ArchiCAD® 8 optional
spaltei>0, Typ integer; Zahlenwert, kein Ausdruck; Ab ArchiCAD® 8 optional

Aufklappen Erläuterung
Deklariert ein oder mehrere Variablen als sogenannte Arrays (Feld- oder Tabellenvariablen). Sie entsprechen den Parametern mit "Ansammlungswerten" in der Parameterliste.

Ein Array enthält mehere Werte, die tabellenartig gespeichert werden. Der Inhalt der Tabellenzellen ist durch Angabe von Indizes in eckigen Klammern nach dem Variablennamen als Koordinatenangabe gezielt ansprechbar.

Die Ausdehnung eines Arrays bezeichnet man als Dimension. In GDL sind maximal 2 Dimensionen von nur arbeitsspeicherbegrenzter Größe möglich.
Eindimensionale Arrays sind wie einspaltige Tabellen zu sehen.
Jede Dimension beginnt mit dem Index 1 und muss mindestens die Größe 1 haben.

Bis ArchiCAD 7 sind nur statische Arrays möglich. D.h. Im DIM-Befehl wird ein fester Wert für die maximale Ausdehnung der Dimensionen angegeben.
Ab ArchiCAD 8 kann eine oder beide Dimensionen eines Arrays unbestimmt (dynamisch) deklariert werden. Seine tatsächliche Ausdehnung richtet sich dann nach den größten im Skript verwendeten Indizes.

Mit einem DIM-Befehl können beliebige Arrays definiert werden (ein- oder zweidimensional, Text oder numerisch, statisch oder dynamisch gemischt).

Jede Variable kann in jedem Skript nur einmal deklariert werden. Erfolgt die Deklaration im Master-Skript darf in keinem anderen Skript die gleiche Variable noch einmal deklariert werden.

Aufklappen Beispiel
Beispiel 1:
DIM posX[7]
DIM pos[3][7]
DIM posX[], posY[15], pos[][30]


Definiert verscheidene statische und dynamische Arrayvariablen.

Beispiel 2:
! Deklaration von 3 Arrayvariablen
DIM f1 [5], v1[], v2[][]

! Ausdehnung von v1: 3 Felder; v1[1] = 0, v1[2] = 0
v1[3] = 3

! Ausdehnung von v2: 6 Felder (2x3); alle anderen Zellen = 0
v2[2][3] = 23

! Zwischenausgabe aller Werte
PRINT v1, " ", v2, "(",VARDIM1(v2),"x",VARDIM2(v2),")"

! Wertezuweisung für statisches Array
FOR i = 1 TO VARDIM1(f1)
f1 [i] = i**2
NEXT i

! v1 wird identisch zu f1
v1 = f1

! Erste Zeile von v1 enthält f1, Werte der 2. Zeile bleiben erhalten
v2 [1] = f1

! Zwischenausgabe aller Werte
PRINT v1, " ", v2, "(",VARDIM1(v2),"x",VARDIM2(v2),")"


! Neuen dynamischen Typ deklarieren
DIM typ[3][3]

! "Löschen" von v2
v2=typ

! Einige Zellen werden nun Text
v2[1][2]=" X "
v2[2][1]=" X "
v2[3][2]=" X "

! Ãœbertragung des Datentyps von v2 in typ
FOR i = 1 TO VARDIM1(v2)
FOR j = 1 TO VARDIM2(v2)
typ[i][j] = VARTYPE(v2[i][j])
NEXT j
NEXT i

! Ausgabe Inhalt v2 und typ
PRINT v2, "(Inhalt)\n", typ , "(Typ)"


Aufklappen Besonderheiten
DATENTYPEN:
Eine dynamisch oder statisch angelegte Zelle eines Arrays wird zunächst als allgemein numerisch mit dem Inhalt 0 interpretiert. Erst nach der ersten Zuweisung in Form von z.B.
var[1][3]="Inhalt"
wird Datentyp und Inhalt festgelegt. Ein Array kann verschiedene Datentypen gleichzeitig enthalten. Der "Haupt"datentyp des kompletten Arrays wird, z.B. abfragbar mit VARTYPE(), wie die erste Zelle (Zeile 1[, Spalte 1]) angenommen.

Da vor der ersten Zuweisung der Datentyp "unbestimmt numerisch" ist, ist es ratsam nach der Deklarierung z.B. in einer Schleife allen Zellen einen Grundwert zuzuweisen und somit auch den Datentyp festzulegen.

Variablen, die bereits über die Parameterliste des Objektes als Array definiert wurden, müssen/ dürfen nicht noch einmal im Skript mit DIM erklärt werden. Eigentlich müsste ArchiCAD bei dem Versuch eine Fehlermeldung ausgeben, da doppelte DIM-Anweisungen nicht zuläsig sind. In ArchiCAD® 10 (1010) wird dennoch der Befehl ausgeführt und alle Werte in dem doppelt deklarierten Array auf 0 gesetzt.

Beim Precompilen des Objektes prüft ArchiCAD, ob alle als Array verwendeten Variablen auch zuvor mit DIM oder in der Parameterliste als solche definiert wurden, sonst wird eine Fehlermeldung erzeugt. Unglücklicherweise wird dies nach der Reihenfolge im Skript geprüft. Steht DIM in einem Unterprogramm am Ende des Skriptes und wird die Arrayvariable oberhalb im Skript verwendet, wird eine Fehlermeldung ausgegeben. Auch wenn korrekt vor der ersten Verwendung das Unterprogramm und der DIM-Befehl ausgeführt wird.

SPEICHERBEDARF:
Mit dynamischen Arrays können während der Skriptausführung nahezu beliebig große Arrays entstehen (Der maximale Index liegt bei 2'147'483'647). Bei unkontrollierter oder unbedachter Ausdehnung kann es zu "out of memory errors" oder gar zu Archicad-Abstürzen kommen. Wahrscheinlicher ist jedoch, dass die Objekte sehr langsam werden.
Wenn nicht anders benötigt, sind statische Arrays vorzuziehen. Neben der Kontrolle durch die Programmablaufplanung kann mit den Befehlen VARDIM1() und VARDIM2() die Ausdehnung eines Arrays kontrolliert werden.


Aufklappen Tipps und Tricks
I.d.R. wird von einer Arrayvariablen nur ein einzelner Wert in einem Ausdruck oder Befehl benötigt. Dieser wird durch die dem Variablennamen nachgestellten Indizes angegeben. Diese können bei der Abfrage und Zuweisung von Werten entgegen der Syntax bei der Deklaration mit dem DIM-Befehl auch numerische Ausdrücke und Variablen enthalten.

Aber auch die Übergabe oder Übernahme des kompletten Arrays ist in einigen Umgebungen sinnvoll und möglich:

  1. Eine Arrayvariable kann den (kompletten) Inhalt eines anderen Arrays übernehmen. Das gilt für beliebige dynamische Arrays gleicher Dimension und für statische Arrays gleicher Dimension und Ausdehnung.
Bei Zuweisungen mit Arrays unterschiedicher Ausdehnung erhält das Zielarray die Dimensionen des Ursprungsarrays.
Das Ursprungsarray kann sehr wohl ein statisches und von der Größe des Zielarrays abweichendes sein. Evt. vorher enthaltene Werte werden natürlich im Zielarray überschrieben und seine Ausdehnung auf die des Ursprungsarrays reduziert oder erweitert.

  2. In einigen Befehlen kann, ähnlich der Verwendung von PUT und GET, der komplette Arrayinhalt als Parameterreihe übergeben werden:
CALL, PRINT, LET, PUT, OUTPUT, VALUES
Analog kann eine Reihe von Werten in ein Array übertragen werden:
REQUEST, INPUT, SPLIT
Auch hier gilt, dass es sich um ein dynamisches Array handeln muss.
Dabei werden die Werte zeilenweise von links nach rechts übergeben.

Aufklappen ArchiCAD
ab 6.5