8.4 Tabellen

Eine Tabelle (Table) ist eine Sammlung von vielen Datenelementen, die von jeder Art sein können. Die Tabelle ist die universale Datenstruktur in Hollywood, welche in vielen Formen, z.B. als Array, Liste oder Record benutzt werden kann. Tabellen werden deklariert, indem man den Konstruktor verwendet. Folgender Code erstellt eine leere Tabelle:

 
a = {}

Eine leere Tabelle kann nicht verwendet werden, weil es keine Daten darin hat. Hollywood verlangt, dass alle Elemente einer Tabelle initialisiert werden müssen, bevor sie verwendet werden können. Wenn sie jetzt versuchen, auf ein leeres Element in der Tabelle zuzugreifen

 
b = a[0]

würde Ihnen eine Fehlermeldung mitteilen, dass Element 0 noch nicht initialisiert worden ist. Sie haben nur Zugang zu Elementen, die Sie vorher initialisiert haben. Die korrekte Version wäre deshalb:

 
a[0] = 5     ; weist 5 a[0] zu
b = a[0]     ; weist 5 b zu

Oder Sie könnten auch den Konstruktor benutzen, um die Tabelle zu initialisieren:

 
a = {5}   ; Kreiert eine Tabelle und weist die Zahl 5 dem Element 0 zu
b = a[0]  ; weist 5 b zu

Den Konstruktor können Sie auch verwenden, um eine Tabelle mit mehreren Elementen zu erzeugen. Er setzt die angegebenen Werte der Tabelle fest, der bei Element/Index 0 beginnt:

 
a = {1, 2, 4, 8, 16, 32, 64} ; erstellt eine Tabelle mit 7 Elementen
b = a[5]  ; weist b 32 zu (32 ist in Element 5 der Tabelle a abgelegt)

Um eine Tabelle mit einer spezifischen Größe zu definieren und initialisieren, können Sie die Anweisungen Dim und DimStr benutzen.

Es ist wichtig zu wissen, dass wenn Sie einer Variablen eine Tabelle zuweisen, die Variable nur eine Referenz/Assign zur Tabelle erhält. Es wurde keine unabhängige Kopie der Tabelle erzeugt:

 
a = {1, 2, 3, 4, 5}       ; erzeugt eine Tabelle mit 5 Elementen
b = a                     ; b erhält eine Referenz auf a
b[0] = 2                  ; legt in Element 0 den Wert 2 ab
DebugPrint(a[0], b[0])    ; wird "2 2" ausgeben

Möchten Sie eine unabhängige Kopie einer Tabelle, können Sie den Befehl CopyTable() verwenden.

In Hollywood können Elemente nicht nur positive ganze Zahlen, sondern auch negative ganze Zahlen, Fließkommazahlen und Zeichenketten sein:

 
a       = {}  ; erstellt eine leere Tabelle
a[-5]   = 3   ; legt 3 in Element -5 ab
a[1.5]  = 2   ; legt 2 in Element 1.5 ab

Wenn Sie diese spezielle Initialisierung mit dem Konstruktor machen wollen, müssen Sie eckige Klammern benützen. Die drei Zeilen oben können auch so geschrieben werden:

 
a = {[-5] = 3, [1.5] = 2}  ; erzeugt eine Tabelle mit zwei Elementen

Wollen Sie Zeichenketten als Index benutzen, können Sie die folgenden Anweisungen benutzen:

 
a         = {}          ; erstellt eine leere Tabelle
a["name"] = "John Doe"  ; legt "John Doe" in Element "name" ab
a["age"]  = 20          ; legt "20" in Element "age" ab
a["sex"]  = "male"      ; legt "male" in Element "sex" ab

Ein leichterer Weg, Zeichenketten als Index zu benutzen, wäre der Ausdruck mit Punkt (.):

 
a         = {}          ; erstellt eine leere Tabelle
a.name    = "John Doe"  ; legt "John Doe" in Element "name" ab
a.age     = 20          ; legt "20" in Element "age" ab
a.sex     = "male"      ; legt "male" in Element "sex" ab

Mit dem Konstruktor erreichen Sie dasselbe wie die beiden Beispiele vorher:

 
a = {["name"] = "John Doe", ["age"] = 20, ["sex"] = "male"}

Oder der leichtere Weg:

 
a = {name = "John Doe", age = 20, sex = "male"}

Auf die Elemente können Sie mit folgenden zwei Möglichkeiten zugreifen:

 
b = a["name"]
b = a.name

Beide Zeilen legen den gleichen Wert in b ab. Der übliche Weg ist die Methode mit dem Punkt. Hollywood unterscheidet nicht zwischen Groß- und Kleinschreibung. Deshalb würde auch a.NAME oder sogar a.NaMe funktionieren.

Es gibt jedoch eine Ausnahme: Wenn Sie Tabellenfelder mit eckigen Klammern initialisieren oder darauf zugreifen, unterscheidet Hollywood zwischen Groß- und Kleinbuchstaben. Weitere Details zu diesem Thema finden Sie in der Dokumentation des Befehls RawGet(). Siehe RawGet für Details.

Einer Tabelle können sie Elemente hinzufügen, indem Sie ihnen einfach einen Wert zuweisen. Wollen Sie Elemente entfernen, dann weisen Sie ihm Nil zu. Das ist ein weiterer Vorteil von Hollywood gegenüber anderen Programmiersprachen. Tabellen werden nicht auf eine bestimmte Größe beschränkt.

In Tabellen können Sie die bisher genannten Elemente vermischen:

 
a = {x = 1, y = 2, 10, 11, 12, 13, z = 3, [6] = 16, 14, 15, obj="Cube"}

Dies erstellt eine neue Tabelle und initialisiert die Elemente 0 bis 6 mit den Zahlen 10 bis 16. Zusätzlich werden vier Elementen mit den Namen x, y, z und obj erstellt und mit 1, 2, 3 und "Cube" initialisiert.

Nun werfen wir einen Blick auf einige komplizierte Tabellenkonstruktionen für fortgeschrittene Programmierer. Als Anfänger wollen Sie vielleicht den folgenden Teil überspringen.

 
buts = { {x1 = 0, y1 = 0, x2 = 100, y2 = 50},
         {x1 = 100, y1 = 0, x2 = 80, y2 = 50},
         {x1 = 180, y1 = 0, x2 = 100, y2 = 50} }

Dieser Code erzeugt eine Tabelle mit dem Namen buts und initialisiert die ersten drei Elemente mit Start- und Endpunkt eines Knopfes (Button). Nun können wir folgenden Code benutzen, um jene drei Knöpfe zu erstellen:

 
For k = 0 To 2
    CreateButton(k + 1, buts[k].x1, buts[k].y1, buts[k].x2, buts[k].y2)
Next

Mehrdimensionale Tabellen sind auch kein Problem. Der folgende Code erstellt eine Matrize von der Größe 50x100 und initialisiert alle Elemente mit Null:

 
N = 50
M = 100
mtx = {}                    ; erstellt eine leere Tabelle
For i = 0 To N - 1
    mtx[i] = {}             ; erstellt eine neue Reihe in der Tabelle
    For j = 0 To M - 1
            mtx[i][j] = 0   ; initialisiert die Elemente mit 0
    Next
Next

Sie können auch die Anweisungen Dim und DimStr benutzen, um mehrdimensionale Tabellen zu erstellen.

Sie müssen keine Konstanten verwenden, wenn Sie eine Tabelle mit dem Konstruktor erstellen und initialisieren. Zum Beispiel:

 
s$ = "test"
i = 5
a = {[s$] = "An element", [i * 5 + 1] = "Another element"}

Dieser Code erstellt eine Tabelle mit dem Namen a und den beiden Elementen "test" (a.test) und 26 (a[26]). a.test wird mit "An element" und a[26] mit "Another element" initialisiert.

Seien Sie nicht verwirrt, wenn Sie so etwas sehen:

 
x = 5
y = 4
a = {x = x, y = y}     ; legt 5 in "x" und 4 in "y" ab

Diese Tabellendeklaration ist ein Unsinn. Es erstellt eine Tabelle mit den beiden Elementen x und y. Das Element x bekommt den Wert der Variable x und Element y den von der Variable y. Eine andere Möglichkeit, den oben erwähnten Code zu schreiben, wäre:

 
x = 5
y = 4
a = {}        ; erstellt eine leere Tabelle
a.x = x       ; legt 5 in a.x ab
a.y = y       ; legt 4 in a.y ab

Beide Codeschnipsel erstellen die gleiche Tabelle.

Schlussendlich können Sie auch Funktionen in einer Tabelle ablegen. Hier ist ein Beispiel:

 
a = {Add = Function(v1, v2) Return(v1 + v2) EndFunction,
     ShowBrush = DisplayBrush}
a.ShowBrush(1, #CENTER, #CENTER)  ; ruft DisplayBrush() auf
b = a.Add(15, 16)                 ; weist 31 b zu

Dieser Code erstellt eine Tabelle mit zwei Funktionen. Die erste Funktion fügt zwei Werte hinzu, die zweite bezieht sich einfach auf den Hollywood-Befehl DisplayBrush(). Sie könnten diesen Code auch auf folgende Weise schreiben:

 
a = {["Add"] = Function(v1, v2) Return(v1 + v2) EndFunction,
     ["ShowBrush"] = DisplayBrush}
a["ShowBrush"](1, #CENTER, #CENTER)  ; führt DisplayBrush() aus
b = a["Add"](15, 16)                 ; legt 31 in b ab (15+16=31)


Navigation zeigen