Seite 1 von 2
Alternative für dynamische Arrays in Strukturen?
Verfasst: 22.06.2007 06:56
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.
Verfasst: 22.06.2007 06:58
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.
Verfasst: 22.06.2007 08:11
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.
Verfasst: 22.06.2007 08:17
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
Verfasst: 22.06.2007 09:52
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.
Verfasst: 22.06.2007 13:19
von Zaphod
Du könntest auch einfach mit MemoryAllocate arbeiten, dann brauchst du ja nur einen Pointer in der Struktur.
Verfasst: 22.06.2007 13:21
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.
Verfasst: 22.06.2007 14:57
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.

Das will ich jetzt noch nicht sagen.
Aber das mit den Strings ist eine interessante Idee.

Verfasst: 22.06.2007 16:38
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.
Verfasst: 22.06.2007 17:08
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.