LinkedList in Structure (Anwendung wie bei PB-LL)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

LinkedList in Structure (Anwendung wie bei PB-LL)

Beitrag 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.
Zuletzt geändert von STARGÅTE am 09.07.2010 14:35, insgesamt 11-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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...
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag 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.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ich glaub ich schreib's mal in die Wishlist im englischen Forum...
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Es wuerde ja schon reichen wenn man die Pruefung des
Kompilers ueber Bord werfen wuerde.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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 ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten