PureBasic: Arrays, Listen und Maps

Es gibt Fälle, in denen man mehrere zusammenhängende Werte speichern möchte. Nun könnte man für jeden Wert eine eigene Variable anlegen, was jedoch unvorteilhaft wäre und zu Spaghetti-Code führen kann, also zu sehr schwer leslichen und unübersichtlichen Code. Dafür gibt es Arrays.

; Listing 18: Arrays

OpenConsole()

Dim array.l(2)

For x = 0 To 2
  array(x) = x
Next

For x = 0 To 2
  PrintN(Str(array(x)))
Next

Delay(2000)
Ausgabe:

0
1
2

In der 5. Zeile wird das Array deklariert und definiert. Dazu gibt es das Schlüsselwort Dim. Man schreibt dahinter den Bezeichner für das Array und in runden Klammern, die zum Bezeichner gehören, den höchsten sogenannten Index. Der Index wird benötigt, um auf die einzelnen Variablen, die im Array gespeichert sind, zuzugreifen. Der niedrigste Index ist 0. Die Typzuweisung soll verdeutlichen, wie man Arrays unterschiedlichen Typs erzeugt, nämlich genauso, wie bei normalen Variablen auch. Ein Array nimmt immer die Anzahl der Elemente mal die Größe einer einzelnen Variable des Arrays im Speicher ein, in diesem Fall also 12 Byte, da es sich um ein Array von Longs handelt (3 x 4 Byte). In der ersten For-Schleife sieht man, wie ein Zugriff auf ein Array aussieht: Man schreibt in die Klammern des Bezeichners den Index auf den man zugreifen will. Durch die For-Schleife greift man nacheinander auf alle Indizes zu. Genauso kann man auch die Werte der Variablen im Array abrufen, was in der zweiten For-Schleife geschieht.

Größenänderung

Bearbeiten

Es ist möglich die Größe eines Arrays im Programm zu ändern.

; Listing 19: ReDim

OpenConsole()

Dim a.l(2)

For x = 0 To 2
  array(x) = x
Next

For x = 0 To 2
  PrintN(Str(a(x)))
Next

ReDim a(3)

a(3) = 3
PrintN(Str(a(3)))

Delay(2000)
Ausgabe:

0
1
2
3

Das Beispiel unterscheidet sich insofern von dem ersten, als dass weiter unten das Array um ein Element erweitert wird, nämlich über das Schlüsselwort ReDim. Man schreibt dabei in die Klammern des Bezeichners die neue Größe des Arrays. Wenn die neue Größe kleiner ausfällt als die vorige wird der Rest "abgeschnitten".

Mehrdimensionale Arrays

Bearbeiten

Mehrdimensionale Arrays kann man sich als Arrays von Arrays vorstellen. Unter jedem Index des ersten Arrays ist ein weiteres Array. Bildlich kann man sich das so vorstellen: Ein einfaches Array ist eine Reihe von Variablen, ein zweidimensionales Array ist dann ein Schachbrett-ähnliches Gebilde und ein dreidimensionales ein Raum. Ab vier Dimensionen hinkt der Vergleich jedoch, dann sollte man sich der Baumdarstellung als Array von Arrays von Arrays von Arrays... bemühen.

; Listing 20: Arrays

OpenConsole()

Dim a.l(2,2)

For x = 0 To 2
  For y = 0 To 2
    a(x,y) = x
  Next
Next

For x = 0 To 2
  For y = 0 To 2
    Print(Str(a(x,y)))
  Next
PrintN("")
Next

Delay(2000)
Ausgabe:

000
111
222

Ein mehrdimensionales Array wird erzeugt, indem man in die Klammern mehrere maximale Indizes getrennt durch Kommata schreibt. In diesem Fall wurde z.B. ein zweidimensionales Array erzeugt. Wenn man ein dreidimensionales erzeugen möchte, müsste ein weiterer maximaler Index, wieder durch ein Komma getrennt, hinzugefügt werden. Außerdem wurde hier die sogenannte Verschachtelung angewandt. Es wurde eine For-Schleife in eine For-Schleife geschrieben, d.h. es wird in der ersten Iteration der äußeren Schleife die komplette innere ausgewertet. In der zweiten wird wieder die komplette innere ausgewertet usw. Dies macht man sich zunutze, um das mehrdimensionale Array zu füllen: Der erste Index bleibt gleich und es wird das komplette darunterliegende Array gefüllt. Dann wird das nächste gefüllt usw.

Man beachte, dass bei mehrdimensionalen Arrays nur die Größe der letzten Dimension geändert werden kann. Im Fall aus Listing 20 müsste man schreiben ReDim a(2,neue_größe).

Linked Lists

Bearbeiten

Linked Lists (Listen) sind dynamische Datenstrukturen, die sich dadurch abheben, dass dynamisch Elemente hinzugefügt und entfernt werden können. Im Prinzip sind es also dynamische Arrays, auch wenn die interne Darstellung eine ganz andere ist.

; Listing 21: Linked Lists

OpenConsole()

NewList l.l()

For x = 1 To 10
  AddElement(l())
  l() = 1
Next

SelectElement(l(),2)
InsertElement(l())

l() = 15

FirstElement(l())
For x = 1 To 11
  PrintN(Str(l()))
  NextElement(l())
Next

Delay(2000)
Ausgabe:

1
1
15
1
1
1
1
1
1
1
1

Es werden untereinander 11 Zahlen ausgegeben, nämlich zehn Einsen, sowie an der dritten Stelle eine 15.

Zuerst wird eine neue Liste mittels NewList erzeugt, wobei die Klammern wie bei Arrays zum Bezeichner gehören. Mit AddElement() wird immer wieder ein neues Element zur Liste hinzugefügt, das danach einen Wert zugewiesen bekommt. Man sieht das kein Index von Nöten ist, vielmehr verwaltet PureBasic für jede Liste einen internen Index und man muss selber mit den verfügbaren Befehlen dafür sorgen, dass auf das richtige Element zugegriffen wird. AddElement() setzt immer den Index auf das neue Element. Mit SelectElement() kann man den Index der Liste ändern, wobei wie bei Arrays das erste Element den Index 0 hat. InsertElement() fügt ein neues Element vor dem aktuellen ein und setzt den Index auf dieses. FirstElement() setzt den Index zurück auf das erste Element, sodass anschließend mit der For-Schleife die Liste ausgegeben werden kann, wobei NextElement() den Index auf das nächste Element setzt.

Weitere Befehle stehen in der Handbuch-Referenz.

Maps sind Datenstrukturen, in denen die Elemente nicht über Indizes referenziert werden, sondern über Schlüssel.

; Listing 22: Maps

OpenConsole()

NewMap initialen.s()

initialen("HP") = "Hans Peter"
initialen("KS") = "Kirill Schuschkow"

PrintN(initialen("HP"))
PrintN(initialen("KS"))

Delay(2000)
Ausgabe:

Hans Peter
Kirill Schuschkow

Maps werden ähnlich wie Listen angelegt, durch das Schlüsselwort NewMaps. Jedoch muss man neue Element nicht über einen Add-Befehl hinzufügen, sondern es reicht auf die Map mit dem neuen Schlüssel zuzugreifen und gleichzeitig mit dem Wert für diesen Schlüssel zu initialisieren; das Element wird dann mit dem Wert neu angelegt. Über diese Schlüssel kann dann auf die Elemente zugegriffen werden. Die PureBasic-Referenz stellt vielseitige Befehle zu Maps vor.

ForEach-Schleife

Bearbeiten

Mit der ForEach-Schleife ist es möglich alle Elemente von Listen und Maps einfach zu durchlaufen.

; Listing 23: ForEach-Schleife

OpenConsole()

NewMap initialen.s()

initialen("HP") = "Hans Peter"
initialen("KS") = "Kirill Schuschkow"

ForEach initialen()
  PrintN(initialen())
Next

Delay(2000)
Ausgabe:

Hans Peter
Kirill Schuschkow

Die ForEach-Schleife durchläuft alle Elemente einer Map, ohne dass man die Schlüssel eingeben muss. initialen() repräsentiert dann immer das aktuelle Element, das dementsprechend über diesen Bezeichner verändert werden kann.

Die ForEach-Schleife funktioniert auf die gleiche Art und Weise mit Linked Lists.

Aufgaben

Bearbeiten
  1. Es soll ein Programm geschrieben werden, dass ein Menü anzeigt. Es soll die Möglichkeit geben ein zweidimensionales Feld auszugeben, das standardmäßig mit Nullen gefüllt ist, oder eine Koordinate einzugeben. Wenn eine Koordinate eingegeben wird, soll auf das Feldelement, das durch die Koordinate repräsentiert wird, eine 1 addiert werden.