Alternative für dynamische Arrays in Strukturen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Alternative für dynamische Arrays in Strukturen?

Beitrag von Thorium »

Wie bekannt unterstützt PB leider keine dynamischen Arrays in Strukturen.

Ich arbeite im Moment an einem Projekt, welches mit recht komplexen Datenstrukturen arbeitet, deshalb will ich das auch möglichst in Structures packen, wegen der Übersicht. Also ich bräuchte eigentlich dynamische Arrays in den Structures. Wie würdet ihr das umsetzen, welche Alternativen gibt es? Es geht mir in erster Linie um die Übersicht, die Performance ist nebensächlich in dem Projekt.

Mal als Beispiel was ich meine und so natürlich nicht funktioniert:

Code: Alles auswählen


Structure StrucA
  A.l
  B.l[]
EndStructure

Structure StrucB
  A.l
  B.l
  C.l
  D.StrucA[]
EndStructure

Structure StrucC
  A.l
  B.l
  C.StrucB[]
  D.l
  E.l
EndStructure

Global Dim A.StrucC()
Die Namen sind hier natürlich jetzt bedeutungslos.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Mh, wäre es mäglich, eine LinkedList dort einzubinden? Oder falls das nicht geht nur einen Pointer auf diese (das erste Element).

Wäre auf jeden Fall eine Alternative zu fest-dimensionierten Arrays.
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Gibt sehr viele Moeglichkeiten. Du kannst dir dein eigenes Array
schreiben, oder aber die Object-Lib von PB nutzen, die Linklisten
von PB lassen sich auch einfach umbauen. Selbst Windows bietet
da mit DPA oder DSA etwas an.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Ich habe mal gemacht, in dem ich Speicher allociert habe und den Pointer auf das erste Element in der Liste gespeichert habe.
Den Speicher kan nich je nach Bedarf verändern....

Geht recht gut
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

LinkedLists helfen da leider nicht weiter, da ich ja eine dynamische Anzahl an LinkedLists brauchen würde, da ich dynamische Arrays in dynamischen Arrays haben will. Und so wie ich das gelesen habe muss ich ja jede Liste mit eigenem Namen erstellen.

So wies aussieht werde ich wohl nicht drumrum kommen mir da eine eigene Array-Verwaltung zu programmieren. Wird aber nicht so schön sein wie ein echter dynamic Array Support in Structures, da ich in dem Fall auf jeden Fall Prozeduren aufrufen muss.

Ich finde das ist ne große Schwachstelle von PB, die mir jetzt erst so richtig auffällt. Klar kann man sich da was basteln und API bietet ja auch was. Aber dadurch wird das alles viel unübersichtlicher. Da hat VB doch noch einen Vorteil.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Du könntest auch einfach mit MemoryAllocate arbeiten, dann brauchst du ja nur einen Pointer in der Struktur.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Aber du wirst doch sicherlich n leine Vorstellung haben wie größ deine Array werden könnten.

Und dann machst du halt mal am Anfang:

Code: Alles auswählen

Structure StrucA 
A.l 
B.l[1000] 
EndStructure 

Structure StrucB 
A.l 
B.l 
C.l 
D.StrucA[1000] 
EndStructure 

Structure StrucC 
A.l 
B.l 
C.StrucB[1000] 
D.l 
E.l 
EndStructure 

Dim A.StrucC(10000) 
Klar wird dnan n Menge Speicher sinnlos verbraten, aber du meintest ja oben :
die Performance ist nebensächlich in dem Projekt
Und dann wäre da noch n Idee :

Strings als dyn. Arrays zu benutzen.
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
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

STARGÅTE hat geschrieben: Klar wird dnan n Menge Speicher sinnlos verbraten, aber du meintest ja oben :
die Performance ist nebensächlich in dem Projekt
Und dann wäre da noch n Idee :

Strings als dyn. Arrays zu benutzen.
Naja schon, aber das Projekt ist so schon ein extremer Speicherfresser. Warscheinlich werden meine 2GB RAM garnicht ausreichen und ich muss sowieso viel auf die HD auslagern.

Und jetzt nicht fragen was das werden soll. :mrgreen:
Das will ich jetzt noch nicht sagen.

Aber das mit den Strings ist eine interessante Idee. :allright:
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Hmm und wenn Du einfach extern Arrays deklarierst und immer nur den Pointer darauf in Deiner Struktur speicherst? Dürfte doch eigentlich kein Problem sein. Dann kannst Du Dir eine Art Konstruktor für die Struktur basteln, z.B.

Code: Alles auswählen

Structure Zeugs
  A.l
  B.l
  *array.l
EndStructure

Procedure.Zeugs newZeugs(*array.l)
  *new.Zeugs = AllocateMemory(SizeOf(Zeugs))
  Zeugs\*array = *array
  ProcedureReturn *new
EndProcedure


Dim dasArray.l(100)
zeug.Zeugs = newZeugs(@dasArray)
Bin mir jetzt grad nicht sicher ob die Syntax überall 100% stimmt (hab grad keinen PB-Compiler zur Hand), aber so vom Prinzip her müßte es so gehen.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Aber das mit den Strings ist eine interessante Idee.

achtung:
dann darf aber keine zelle einen NULL-wert enthalten,
bzw. bei verwendung von UNICODE zwei Nullen aufeinanderfolgen.
ein (bzw. zwei) Nullbyte terminiert einen string im Pool,
PB kann keine strings verwalten, die nullzeichen enthalten.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten