Seite 1 von 3

LinkedList in Structure (Anwendung wie bei PB-LL)

Verfasst: 09.01.2008 03:31
von STARGÅTE
Das Include würde mit PureBasic-Update 4.50 überflüssig, da dort nun Listen in Strukturen erlaubt sind.

Tachchen,

Dies ist eine Include die es ermöglicht LinkedLists in anderen LinkedLists oder Strukturen zu erstellen und deren Anwendung fast genau so ist, wie die, der "echte" LinkedList in PureBasic.

Hier die Include.pbi : Nicht mehr verfügbar!

Diese LinkedList kann man überall erstellen :
- in LinkedLists von PB
- in LinkedLists von dieser Art hier
- in Structuren

Alle Proceduren arbeiten genau so wie die echten von PureBasic, und haben auch die gleiche Bezeichnung mit einem _ als Merkmal.

KleineUnterschiede:

NewList_(Variable, Structurename)
- Hier muss die Variabel die eine LinkedList werden soll und deren StructureName angegeben werden.
! Dabei muss der StructureName kleingeschrieben werden !

CurrentElement_(Variable)
- Bei PureBasic LLs kann einfach mit @LinkedList() der aktuelle Pointer ausgegeben werden. Bei diesen hier muss dies mit CurrentElement_(Variable) ausgelesen werden.

Structuren für diese LinkedList müssen mit den dafür vorgesehenen Macros erstellt werden:
Structure_(StructureName)
EndStructure_(StructureName)
(Dadurch wird die Speicherfreigabe ermöglicht)


Hier ein Beispiel wie es dann im Code aussieht:
Code in PureBasic hat geschrieben:IncludeFile "LinkedList.pbi"

; Beispiel
;==========

Structure_(waffe)
 Nummer.l
 Gewicht.f
 Name$
EndStructure_(waffe)

Structure_(mensch)
 Name$
 xPos.l
 yPos.l
 Waffe.Waffe
EndStructure_(mensch)

NewList_(Mensch.Mensch, mensch)

For n = 1 To 4
 AddElement_(Mensch)
 Mensch\Name$ = "Vorname"+Str(ListIndex_(Mensch))+" Nachname"+Str(ListIndex_(Mensch))
 Mensch\xPos = Random(1000)
 Mensch\yPos = Random(1000)
 NewList_(Mensch\Waffe, waffe)
 Anzahl = Random(3)+2
 For i = 1 To Anzahl
  InsertElement_(Mensch\Waffe)
  Mensch\Waffe\Nummer = i*i
  Mensch\Waffe\Gewicht = Sqr(i+i)
  Mensch\Waffe\Name$ = "Waffenname"+Str(i)
 Next i 
Next n
 
ResetList_(Mensch)
While NextElement_(Mensch)
 Debug "========="
 Debug "Element:"+Str(ListIndex_(Mensch))
 Debug "Name="+Mensch\Name$
 Debug "x="+Str(Mensch\xPos)
 Debug "y="+Str(Mensch\yPos)
 Debug "Waffen >"
 Debug "---------"
 ResetList_(Mensch\Waffe)
 While NextElement_(Mensch\Waffe)
  Debug " Waffe:"+Str(ListIndex_(Mensch\Waffe))
  Debug " Name="+Mensch\Waffe\Name$
  Debug " Nummer="+Str(Mensch\Waffe\Nummer)
  Debug " Gewischt="+StrF(Mensch\Waffe\Gewicht)
 Wend
 Debug "---------"
Wend
UPDATE 1.0.1:
- FreeList_() ist jetzt drin
UPDATE 1.0.2:
- BUGFIX
UPDATE 1.3.1:
- Speicher werden nun wirklich komplett freigegeben bei DeleteElement
- FreeList, ClearList (dank mk-soft)
UPDATE 1.3.2:
- kleines Problem behoben
UPDATE 1.3.3:
- IndexFehler bei SelectElement_() behoben
UPDATE 1.4.0:
- verschiedene IndexFehler behoben
- Bugs bei Elementreihenfolge behoben in verbindung mit FirstElement und LastElement
- Erweiterung für 64Bit Pointer.

Verfasst: 10.01.2008 10:04
von ZeHa
Hat eigentlich schonmal jemand Fred gefragt, ob es das irgendwann in PB geben wird? Also so richtig schön nativ? Das wäre nämlich sehr praktisch...

Verfasst: 10.01.2008 10:24
von DrShrek
ZeHa hat geschrieben:Hat eigentlich schonmal jemand Fred gefragt, ob es das irgendwann in PB geben wird? Also so richtig schön nativ? Das wäre nämlich sehr praktisch...
Wie nativ? Was ist praktisch? Ich sehe im Moment keine Vorteile die LL von Stargate zu verwenden.

Verfasst: 10.01.2008 10:44
von ZeHa
Ich meinte, ob es irgendwann unter PB nativ möglich sein wird, eine LinkedList als Element einer Struktur zu verwenden. Hab das mit einem anderen Thread verwechselt, in dem ging es hauptsächlich genau darum, bei Stargate ist es auch möglich (weil's ja letztendlich nur Pointer sind), aber bei ihm war's wohl nicht das primäre Ziel (oder?).

Also was ich meinte, ist sowas hier:

Code: Alles auswählen

Structure Player
    xPos.l
    yPos.l
    NewList weapons.Weapon()
EndStructure

Verfasst: 10.01.2008 10:58
von Kiffi
ZeHa hat geschrieben:Also was ich meinte, ist sowas hier:

Code: Alles auswählen

Structure Player
    xPos.l
    yPos.l
    NewList weapons.Weapon()
EndStructure
das wäre in der Tat sehr praktisch, wenn PB das nativ unterstützen würde.

Grüße ... Kiffi

Verfasst: 10.01.2008 11:39
von ZeHa
Ich glaub ich schreib's mal in die Wishlist im englischen Forum...

Verfasst: 10.01.2008 13:31
von edel
Es wuerde ja schon reichen wenn man die Pruefung des
Kompilers ueber Bord werfen wuerde.

Verfasst: 10.01.2008 14:05
von STARGÅTE
@ZeHa
aber bei ihm war's wohl nicht das primäre Ziel (oder?).
Doch, denau das, dass man meine LL Überall wo man will verwenden kann, und damit so umgehen kann wie mit den echten LL
_____

Aber das problem wird vllt sein, das irgendwo Speicherbrocken rumliegen bleiben wenn man dann mit diesen Listen in Listen in .... falsch umgeht.

Oder die Proceduren wie : DeleteElement(), ClearList(), .... müssen dann alle so arbeiten das die das Element was gelöscht werden soll, selber noch mal nach Internen Listen untersuchen die dann wieder auch gelöscht werden müssen
_____

@Dr. Shrek
meine Listen haben natürlich kein Vorteil gegenüber denen von PB WENN man sie nur "normal" braucht.

Aber für ein RPG-Spiel z.B. könnte man eine Liste in einer Structure gut gebrauch:
Alle Charactere kommen in einer normale NewList Spieler.Spieler()
aber in der Spielerstructure gibs dann eine Liste "Waffe.Waffe" die dann alle Waffen des Spieler enthält. Dort kann man dann einfach Add'en oder Delete'en
____

Ich werde vllt noch eine Liste mit einbauen die Alle erstellten NewList_() enthält und überwacht, damit ich selber mal sehen kann, ob vllt "Brocken" übrig bleiben

Verfasst: 10.01.2008 14:24
von ZeHa
http://www.purebasic.fr/english/viewtopic.php?t=30514
Scheint ein Feature zu sein, das jeder gebrauchen kann :mrgreen:

Vielleicht hat ja der ein oder andere hier auch Lust, ein "+1" (oder "+2" ;) ) hinzuzufügen ;)

Verfasst: 11.01.2008 23:19
von PMV
Ach so, LinkedLists in LinkedLists ... sag das doch gleich, dann versteh
ichs auch :lol:
... Fals du keine normalen LinkedLists verwendest ... kannst auch Macros
schreiben, dann sparst dir den Unterstrich, so siehts nämlich aus, als obs
API-Befehle wären :wink: ... aber im gegensatz zu den von PB
verwendeten LinkedLists entfallen hier in jedem fall die Klammern. Daher
würde ich deine LinkedList eher mit den normalen zusammen
benutzten. :D Aber die Geschmäker sind halt verschieden :wink: ...
inzwischen stehe ich eh mehr auf Interfaces :? ...

MFG PMV