Dynamische Datenstrukturen nicht möglich mit PB?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Dreamora
Beiträge: 21
Registriert: 10.09.2004 10:44

Dynamische Datenstrukturen nicht möglich mit PB?

Beitrag 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 )
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

Was du brauchst, sind Arrays oder LinkedLists.
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Dreamora
Beiträge: 21
Registriert: 10.09.2004 10:44

Beitrag 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 ...
Benutzeravatar
nightsky
Beiträge: 9
Registriert: 08.09.2004 12:42
Kontaktdaten:

Re: Dynamische Datenstrukturen nicht möglich mit PB?

Beitrag 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
Dreamora
Beiträge: 21
Registriert: 10.09.2004 10:44

Beitrag 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*
Benutzeravatar
nightsky
Beiträge: 9
Registriert: 08.09.2004 12:42
Kontaktdaten:

Beitrag 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 ....
Benutzeravatar
Rob
Shadow Admin
Beiträge: 258
Registriert: 26.08.2004 01:39
Kontaktdaten:

Beitrag von Rob »

Wie wärs mit der TreeLinkedList von NicTheQuick?
Build a man a fire and he's warm for a day. Set a man on fire and he's warm for the rest of his life
Dreamora
Beiträge: 21
Registriert: 10.09.2004 10:44

Beitrag 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.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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)
!UD2
Antworten