Ist auf Elemente einer LL direkt zugreifen OK?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Ist auf Elemente einer LL direkt zugreifen OK?

Beitrag von KeyKon »

Nach langer PureBasic-Abstinenz arbeite ich derzeit mal wieder an einem kleinen Tool.
Dazu habe ich eine kurze Verständnisfrage:

Ich habe eine strukturierte LinkedList auf die ich sehr viel zugreife, um jetzt das ständige hin und herspringen in der Liste zu vermeiden übertrage ich die zur Zeit in Beabreitung stehenden Elemente in Zeiger um direkt auf sie zugreifen zu können während ich trotzdem noch durch die Liste gehen kann:

Code: Alles auswählen

NewList liste.struktur()
Define *elementMarker.struktur
...
*elementMarker = @liste()
Das funktioniert bisher einwandfrei, da in dieser Liste keine Elemente gelöscht werden, nun einige Fragen dazu:
- Ist das so in Ordnung oder kann es passieren dass Elemente ihre Adresse ändern? (z.B beim Ändern der Reihnfolge)
- Kann ich diese Marker ohne Gefahr in Threads verwenden, während ich in der Liste rumwurschtle (bei aktiviertem ThreadSafe)
- Gibt es eine Möglichkeit sicherzustellen dass der Zeiger (noch) auf ein korrektes Element zeigt? Sprich kann ich überprüfen ob das Element noch existiert ohne es in der Liste zu suchen?

Oder Allgemein, gibt es bessere Möglichkeiten mit so etwas umzugehen (Mal von Arrays abgesehen)

LG KeyKon
(\/) (°,,,°) (\/)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Ist auf Elemente einer LL direkt zugreifen OK?

Beitrag von NicTheQuick »

KeyKon hat geschrieben:- Ist das so in Ordnung oder kann es passieren dass Elemente ihre Adresse ändern? (z.B beim Ändern der Reihnfolge)
Die Elemente ändern ihre Adresse nicht, solange sie nicht gelöscht und neu erstellt werden. Ich habe es zwar nicht überprüft, aber sollte sich die Adresse eines Elements ändern, nachdem es an eine andere Stelle in der LinkedList bewegt wurde, wurde der Algorithmus von PB falsch programmiert. Und davon gehe ich nicht aus.
- Kann ich diese Marker ohne Gefahr in Threads verwenden, während ich in der Liste rumwurschtle (bei aktiviertem ThreadSafe)
Solange du mit "rumwurschteln" nur meinst, dass du die Daten, die an den Elementen hängen, änderst, wird es keine Probleme geben. Auch die Reihenfolge der Elemente darf geändert werden, aber nur von einem Thread gleichzeitig. Und beim Zugriff auf die Daten sollte sichergestellt sein, dass diese mit einem Mutex geschützt sind. Alles andere wäre unsauber und kann früher oder später zu unvorhergesehenem Verhalten führen.
- Gibt es eine Möglichkeit sicherzustellen dass der Zeiger (noch) auf ein korrektes Element zeigt? Sprich kann ich überprüfen ob das Element noch existiert ohne es in der Liste zu suchen?
Mir ist keine bekannt.
Oder Allgemein, gibt es bessere Möglichkeiten mit so etwas umzugehen (Mal von Arrays abgesehen)
Da ich nicht genau weiß, was du tatsächlich vor hast, ist das schwer zu beantworten.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: Ist auf Elemente einer LL direkt zugreifen OK?

Beitrag von KeyKon »

NicTheQuick hat geschrieben:Da ich nicht genau weiß, was du tatsächlich vor hast, ist das schwer zu beantworten.
In erster Linie geht es mir nur darum Daten eines Elements mit anderen der Liste zu vergleichen und zu verrechnen, und ich will mir schlicht sparen dafür Zwischenvariablen zu nehmen die ich dann am Ende wieder in die Liste eintragen müsste.

In einem anderen Szenario läuft ein Thread der im Hintergrund Daten lädt/verrechnet und die Ergebnisse in das gemerkte Element der Liste einträgt, während ich in der Main auf die Daten zugreifen kann sobald sie da sind, dabei hat jedes Element seinen eigenen Mutex damit man nicht auf das Element zugreifen kann während dort Daten eingetragen werden.

LG KeyKon
(\/) (°,,,°) (\/)
Antworten