Seite 1 von 2
Dynamische Datenstrukturen nicht möglich mit PB?
Verfasst: 17.09.2004 14:47
von Dreamora
Ich wollte heute eigentlich ne Tree Struktur erzeugen
Code: Alles auswählen
Structure Node
*left.Node
*right.Node
EndStructure
OldNode.Node
Node.Node
For i = 1 To 20
*OldNode = @Node
Node.Node ; Dadurch wollte ich eigentlich ein neues Element der Structure Node erzeugen
If c
OldNode\right = @Node
Else
OldNode\left = @Node
EndIf
Next
Tja wollte
Tut es jedoch nicht und da es ( scheinbar ) kein New Command zu schein gibt, frage ich mich ob ich das nur durch einen Trick ( Funktion die eine Variable erzeugt und in einem zweiten Schritt einer globalen "Rückgabevariable" ihre Adresse zu weisst ) überhaupt etwas derartiges machen kann.
( Die Suche habe ich verwendet. Gab aber scheinbar noch keine solche Frage. Auch nicht im Archiv ... oder sie hat sich mir entzogen )
Verfasst: 17.09.2004 16:46
von Lars
Was du brauchst, sind Arrays oder LinkedLists.
Verfasst: 17.09.2004 17:27
von bobobo
arrays sind nicht brauchbar da so undynamisch
linkedlists sind dynamisch erweiterbar und damit dafür brauchbar
und da gibt es dann auch ein addelement (statt new)
Verfasst: 17.09.2004 22:28
von Dreamora
LinkedLists, sind wie ihr Name ja schon sagt, für Listen.
Bei BinBäumen ist der Unterschied schon ziemlich gewaltig.
Aber bei OctTree was ich eigentlich vorhabe, ist der Unterschied
O( n^2 ) von LinkedList zu O( log( n ) / log( 8 ) ) von OctTree.
Würden PointerArrays in Structuren funktionieren könnte man es sogar umsetzen ...
nunja, das liegt ja momentan wohl leider net drin ...
Re: Dynamische Datenstrukturen nicht möglich mit PB?
Verfasst: 17.09.2004 23:45
von nightsky
Dreamora hat geschrieben:
Tut es jedoch nicht und da es ( scheinbar ) kein New Command zu schein gibt, frage ich mich ob ich das nur durch einen Trick ( Funktion die eine Variable erzeugt und in einem zweiten Schritt einer globalen "Rückgabevariable" ihre Adresse zu weisst ) überhaupt etwas derartiges machen kann.
Für eine Variable (in diesem Fall Node) wird, zumindest in ihrem Sichtbereich, nur einmal Speicher reserviert. Du benutzt bei jedem Durchlauf der Schleife die gleiche Variable. Willst Du wirklich jedesmal neuen Speicher haben, musst Du das PureBasic auch sagen. Mein Vorschlag (ungetestet) wäre folgendermaßen:
Code: Alles auswählen
Structure Node
*left.Node
*right.Node
EndStructure
For i = 1 To 20
*OldNode = *NewNode
*NewNode = MemoryAllocate(SizeOf(Node))
If c
*OldNode\right = *NewNode
Else
*OldNode\left = *NewNode
EndIf
Next
Verfasst: 18.09.2004 00:02
von Dreamora
Kann ich ma testen.
Ich habs aktuell über ne Funktion gemacht, die eine lokale "Instanz" einer Structure erzeugt und den Pointer dann einer globalen "Returnstructure" übergibt wodurch das Problem mit der fehlenden Neuzuweisung für den Moment gelöst ist.
Jetzt muss ich mich nur noch am Pointer-Array Problem vorbei schmuggeln
*ich sehs kommen dass ich auf Memorys ende womit ich dann auf dem gleichen Niveau wäre wie DBP, was definitiv frustrierend ist*
Verfasst: 18.09.2004 00:11
von nightsky
Dreamora hat geschrieben:*ich sehs kommen dass ich auf Memorys ende womit ich dann auf dem gleichen Niveau wäre wie DBP, was definitiv frustrierend ist*
Was gefällt Dir daran nicht? Ist doch eigentlich simpel ....
Verfasst: 18.09.2004 00:46
von Rob
Wie wärs mit der
TreeLinkedList von NicTheQuick?
Verfasst: 18.09.2004 01:32
von Dreamora
Wäre eine Idee
Habe gerade mit erschrecken festgestellt, dass die Strukturen scheinbar statisch erzeugt werden?!? ( siehe Bsp unten )
Ich kann mich irren, aber das letzte Mal als ich sowas versucht habe mit 3.7 oder 3.8 gabs keinerlei derartige Probleme. Ob daran der wechsel von LCC zu PelleC eventuell schuld ist? *ma gucken ob ich die alte Version noch rumliegen habe zum Testen ... wird bestenfalls ne 3.8 sein ...*
Code: Alles auswählen
Structure Vector3D
x.f
y.f
z.f
EndStructure
; Node Numbering is bottom up, counterclockwise from +x +z sector
Structure OCT_Node Extends Vector3D
*SubNode.OCT_Node[8]
BoxWidth.f
EndStructure
;Global OCT_NewNode.OCT_Node
Procedure.l OCT_CreateNode()
Node.OCT_Node
;*OCT_NewNode = @Node
ProcedureReturn @Node
EndProcedure
For i = 1 To 5
Debug OCT_CreateNode()
next
die Debug gibt 5x den gleichen Wert aus ... Obwohl es eigentlich 5 verschiedene sein müssten da der Node innerhalb einer Procedure ist.
auch Protected Node.OCT_Node hilft nicht.
Verfasst: 18.09.2004 09:46
von Froggerprogger
Eine in einer Prozedur deklarierte Variable ist ja auch nur auf dem Stack. Um wirklich ein 'new' zu simulieren, also ein auch außerhalb der Prozedur zugängliches 'Objekt', kannst Du das ohne Probleme so machen:
Code: Alles auswählen
Structure Vector3D
x.f
y.f
z.f
EndStructure
Structure OCT_Node Extends Vector3D
*SubNode.OCT_Node[8]
BoxWidth.f
EndStructure
Procedure.l OCT_CreateNode()
Protected *Node.OCT_Node
*Node = AllocateMemory(SizeOf(OCT_Node))
ProcedureReturn *Node
EndProcedure
For i = 1 To 5
Debug OCT_CreateNode()
Next
So ist das kein Problem (nutze ich derart für Queues/RBTrees/Hashtables)