Seite 1 von 1

Dynamische Arrays erstellen

Verfasst: 18.11.2015 12:54
von ccode
Hallo erstmal,

ich stehe etwas auf dem Schlauch.

Wie kann ich dynamische Arrays in PureBasic erstellen?

Benötigt wird eine Strucktur wie diese:

var size = 8
EinArray= new Array(3*size); //In JavaScript gibt es nur 1-Dimensionale Arrays
for (i=0; i<3*size; i++) EinArray = new Array(); //Array einem Array zuweisen (geht in PureBasic ja so nicht)


//Zugriff (z.Bsp.)
EinArray[0][2] = 1;
*JavaScript ->(to) PureBasic

Wichtig ist das dynamische Verhalten der "2. Dimension" des Arrays.

Eine Manipulation das Arrays sollte wie in JavaScript möglich sein:

EinArray[1].length = 3 //Verändert nur die Länge der 2. dynamischen Dimension

ReDim() unter PureBasic würde gehen, aber nur wenn die 2. Dimension statisch ist.

Wie ich das evtl. mit Listen machen soll ist mir noch nicht klar.

Global Dim EinArray((3*size)-1, 999) ;Dies ist falsch (die 2. Dimension muss am Anfang 0 sein und dynamisch wachsen können !!!)

Danke für jegliche Hilfe

Re: Dynamische Arrays erstellen

Verfasst: 18.11.2015 13:12
von STARGÅTE

Code: Alles auswählen

Structure SubArray
	Array Test.i(0)
EndStructure

Dim MainArray.SubArray(10)

Define I

For I = 0 To 10
	Dim MainArray(I)\Test(I)
Next

Debug ArraySize(MainArray(4)\Test())

ReDim MainArray(4)\Test(15)

MainArray(4)\Test(15) = 123 ; Zugriff

Debug ArraySize(MainArray(4)\Test())

FreeArray(MainArray(4)\Test())

Debug ArraySize(MainArray(4)\Test())

Re: Dynamische Arrays erstellen

Verfasst: 18.11.2015 13:13
von NicTheQuick
Es geht über einen Umweg:

Code: Alles auswählen

EnableExplicit

Structure dynamicArray
	Array a.i(0)
EndStructure

Define size.i = 8

; Erstelle Array mit 3 * size Arrays der Größe 1 (0 geht nicht)
Dim EinArray.dynamicArray(3 * size - 1)


; Ändere Größe des Arrays an Position 2 auf 10
ReDim EinArray(2)\a(9)

EinArray(2)\a(9) = 10

Debug EinArray(2)\a(9)
Edit: Mensch STARGATE. Wieso wusste ich, dass du auch gleich antworten wirst. :lol:

Re: Dynamische Arrays erstellen

Verfasst: 18.11.2015 13:52
von ccode
Danke!

So könnte es funktionieren.

Es wird jetzt sehr oft den Aufruf ReDim geben.

Ich muss das jetzt irgend wie als Prozedure hinbekommen.

Re: Dynamische Arrays erstellen

Verfasst: 18.11.2015 13:57
von NicTheQuick
Es ist immer besser, wenn man vorher weiß, wie groß das Array werden wird. Denn ReDim ist nicht gerade resourcensparend. Es überprüft, ob es den aktuell benutzen Speicherbereich erweitern kann. Falls ja, geht es schnell; falls nein, muss an anderer Stelle im Speicher Platz gefunden werden, alle bisherigen Elemente des Arrays dorthin kopiert werden, und dann ist es fertig.
Um also zumindest ein bisschen zu optimieren, würde ich vorher schätzen, wie viele Elemente ich im Voraus brauche und schonmal einen ganzen Batzen allozieren.

Du machst also z.B. immer nur für jeden 100er-Schritt ein Redim und erweiterst jedes mal das Array um 100 Elemente, wenn sie nicht mehr reichen. Damit ersparst du dir wahrscheinlich schon mal jede Menge Rumkopiererei.

Re: Dynamische Arrays erstellen

Verfasst: 19.11.2015 11:15
von TroaX
Ach neee das ist ja sogar die Lösung für mein Sessionproblem. Das ist ja klasse ;)