Dynamische Arrays erstellen

Für allgemeine Fragen zur Programmierung mit PureBasic.
ccode
Beiträge: 7
Registriert: 18.11.2015 12:37
Wohnort: Erzgebirge

Dynamische Arrays erstellen

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Dynamische Arrays erstellen

Beitrag 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())
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Dynamische Arrays erstellen

Beitrag 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:
ccode
Beiträge: 7
Registriert: 18.11.2015 12:37
Wohnort: Erzgebirge

Re: Dynamische Arrays erstellen

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Dynamische Arrays erstellen

Beitrag 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.
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Dynamische Arrays erstellen

Beitrag von TroaX »

Ach neee das ist ja sogar die Lösung für mein Sessionproblem. Das ist ja klasse ;)
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Antworten