LinkedList nicht Pointer-gerecht? [OK]
Verfasst: 11.11.2006 12:52
Hi Leute,
kann es sein, dass Listen in Purebasic nicht ganz Pointer-gerecht aufgeteilt sind? Theretisch müsste ich ja bei mehreren, hintereinandern allozierten Listeneinträgen auch aufeinanderfolgende Speicheradressen haben. Dem ist leider nicht so, weshalb ich mir ein wenig sorgen über die Multifunktionalität meine Effekt-Funktionen in einem Spiel mache. Kleiner Beispielcode:
Ich weiß es nicht so recht, aber er könnte natürlich auch so sein, dass aufgrund der Dynamik der Liste zwischendurch alle anderen Programme auch ihren Speicher dazwischenpacken. Aber dass wirklich JEDES MAL zwischen Zwei Elementen genau 24byte sind, ist mir unheimlich. Deshalb kam ich auf die Idee, andere Strukturgrößen ausprozuprobieren, z.b. hierbei:
Structure pups
menge.b
stufe.b
von.s
X.b oder X.w
EndStructure
gibts 24 bytes. Aber wenn ich ein Long nehme, sinds plützlich 8 byte mehr... Lustigerweise wird ab einem "X.w" auch der zweite Eintrag ausgegeben, was ansich seltsam ist -> da ja konstant 24 byte unterschied sind. Zufall? kA. Ich hätte ganz einfach eine konstante Bytegröße zum Pointer pro Eintrag zugerechnet, aber das klappt nicht, da bei weiteren Struktureinträgen dieser Abstand auch verändert wird.
Hilfe
kann es sein, dass Listen in Purebasic nicht ganz Pointer-gerecht aufgeteilt sind? Theretisch müsste ich ja bei mehreren, hintereinandern allozierten Listeneinträgen auch aufeinanderfolgende Speicheradressen haben. Dem ist leider nicht so, weshalb ich mir ein wenig sorgen über die Multifunktionalität meine Effekt-Funktionen in einem Spiel mache. Kleiner Beispielcode:
Code: Alles auswählen
Structure pups
menge.b
stufe.b
von.s
EndStructure
NewList pupse.pups()
Define.pups *P
Macro printpups
PrintN("pups von " + *p\von)
PrintN("anzahl: " + Str(*p\menge))
Print("Fazit: ")
Select *p\stufe
Case 0: PrintN("nur heiße luft...")
Case 1: PrintN("nett flauschig")
Case 2: PrintN("alle achtung...")
Case 3: PrintN("woaaaahhww O°.°O")
EndSelect
EndMacro
AddElement(pupse())
pupse()\menge = 1
pupse()\stufe.b = 1
pupse()\von = "mama"
AddElement(pupse())
pupse()\menge = 1
pupse()\stufe.b = 2
pupse()\von = "papa"
AddElement(pupse())
pupse()\menge = 3
pupse()\stufe.b = 3
pupse()\von = "baby"
OpenConsole()
FirstElement(pupse())
*p = @pupse()
printpups
;{ fehler-prüf-ausgabe -> pointer geht um 24 byte weiter!
Debug "größe von pups: " + Str(SizeOf(pups))
Debug "pointer: " + Str(*p)
NextElement(pupse())
Debug "liste: " + Str(@pupse())
;}
*p + SizeOf(pups)
printpups
;{ fehler-prüf-ausgabe -> pointer geht um 24 byte weiter!
Debug "größe von pups: " + Str(SizeOf(pups))
Debug "pointer: " + Str(*p)
NextElement(pupse())
Debug "liste: " + Str(@pupse())
;}
*p + SizeOf(pups)
printpups
;{ fehler-prüf-ausgabe -> pointer geht um 24 byte weiter!
Debug "größe von pups: " + Str(SizeOf(pups))
Debug "pointer: " + Str(*p)
NextElement(pupse())
Debug "liste: " + Str(@pupse())
;}
Structure pups
menge.b
stufe.b
von.s
X.b oder X.w
EndStructure
gibts 24 bytes. Aber wenn ich ein Long nehme, sinds plützlich 8 byte mehr... Lustigerweise wird ab einem "X.w" auch der zweite Eintrag ausgegeben, was ansich seltsam ist -> da ja konstant 24 byte unterschied sind. Zufall? kA. Ich hätte ganz einfach eine konstante Bytegröße zum Pointer pro Eintrag zugerechnet, aber das klappt nicht, da bei weiteren Struktureinträgen dieser Abstand auch verändert wird.
Hilfe
