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)