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
BearbeitenEs 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
BearbeitenMehrdimensionale 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
BearbeitenLinked 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
BearbeitenMaps 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
BearbeitenMit 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- 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.