Lists - Verknüpfungen

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
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Lists - Verknüpfungen

Beitrag von Josh »

In einem aktuellen Projekt arbeite ich viel mit Listen. Wenn ich nun die List mit ForEach durchlaufe und zur Auswertung auch Informationen des vorhergehenden oder nachfolgenden Listelementes brauche, ist das sehr umständlich. Aus diesem Grund habe ich mir in meine List eine zusätzliche Verknüpfung auf das vorhergehenden und nachfolgende Listelement eingebaut. Damit ist etwas in einer Zeile möglich, was sonst mehrere Zeilen benötigen würde. Z.B.

Code: Alles auswählen

If MyList()\xyz = #True And MyList()\Prev\xyz = #True And MyList()\Prev\Prev\xyz = #True
EndIf
Das mit den eigenen Listfeldern \Next und \Prev hat natürlich auch den Nachteil, dass diese erstellt und korrigiert werden müssen, wenn sich in der List was ändert.

Ich hab nun ein wenig herumgespielt und bin auf folgenden Code gekommen, der die Pb-eigenen Links verwendet. Damit entfällt die Gefahr bei der Wartung der eigenen Links und es wird auch kein zusätzlicher Speicher in der List benötigt.

Code: Alles auswählen

CompilerIf 0

  Structure MYSTRUC
    *NextItem.MYSTRUC[0]
    *PrevItem.MYSTRUC[0]
    Text1$
    Text2$
    x.i
    y.i
    z.i
  EndStructure

CompilerElse

  Macro _MYSTRUC
    Text1$
    Text2$
    x.i
    y.i
    z.i
  EndMacro

  Structure MYSTRUC
    *NextPrevItem.MYSTRUC_EX[0]
    _MYSTRUC
  EndStructure

  Structure MYSTRUC_EX
    *NextItem
    *PrevItem
    *NextPrevItem.MYSTRUC_EX[0]
    _MYSTRUC
  EndStructure

  Macro NextItem : NextPrevItem[-2] : EndMacro
  Macro PrevItem : NextPrevItem[-1] : EndMacro

CompilerEndIf



Debug ""
Debug "==== CREATE LIST ====="
Debug ""

NewList MyList.MYSTRUC()

AddElement (MyList()) : MyList()\Text1$ = "Element1" : MyList()\x = 111
AddElement (MyList()) : MyList()\Text1$ = "Element2" : MyList()\x = 222
AddElement (MyList()) : MyList()\Text1$ = "Element3" : MyList()\x = 333


Debug ""
Debug "==== EXAMPLE 1 ====="
Debug ""

FirstElement (MyList())
NextElement  (MyList())

Debug "" + MyList()\x + " - " + MyList()\PrevItem\Text1$ + " - " + MyList()\PrevItem\x
Debug "" + MyList()\x + " - " + MyList()         \Text1$ + " - " + MyList()         \x
Debug "" + MyList()\x + " - " + MyList()\NextItem\Text1$ + " - " + MyList()\NextItem\x

Debug ""
Debug "==== EXAMPLE 2 ====="
Debug ""

FirstElement (MyList())

Debug MyList()                  \Text1$
Debug MyList()\NextItem\PrevItem\Text1$
Debug MyList()\NextItem         \Text1$
Debug MyList()\NextItem\NextItem\Text1$
Vielleicht kann es mal wer brauchen oder vielleicht hat einer auch noch eine bessere Idee um dies schöner umzusetzen.
Zuletzt geändert von Josh am 14.05.2019 14:22, insgesamt 2-mal geändert.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Lists - Verknüpfungen

Beitrag von Josh »

Hab das Beispiel im ersten Beitrag noch mal ein bisschen aufgepeppt. Nachteil ist noch immer, die Codeverdoppelung die für die Struktur notwendig ist. Vielleicht hat da wer eine Idee, um dies zu vermeiden.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Lists - Verknüpfungen

Beitrag von NicTheQuick »

Josh hat geschrieben:Hab das Beispiel im ersten Beitrag noch mal ein bisschen aufgepeppt. Nachteil ist noch immer, die Codeverdoppelung die für die Struktur notwendig ist. Vielleicht hat da wer eine Idee, um dies zu vermeiden.
Das ist einfach. Nutz das Schlüsselwort Extends.
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Lists - Verknüpfungen

Beitrag von Josh »

NicTheQuick hat geschrieben:Das ist einfach. Nutz das Schlüsselwort Extends.
Nütz leider nichts. Bei Extends werden die Strukturelemente der Extend-Struktur vorangestellt. Ich brauche die unbedingt hinten angefügt. :cry:
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Lists - Verknüpfungen

Beitrag von NicTheQuick »

Dann vielleicht ein eigenes Schlüsselwort à la "EndStructureList", das im Grunde nur ein Macro ohne Parameter ist und ein paar Elemente am Ende hinzufügt bevor tatsächlich "EndStructure" geschrieben wird.

Ich habe mir deinen Code aber auch noch gar nicht so genau angeschaut. Es kommt mir komisch vor, dass das hinten angehängt werden muss. Ich schaue mal, wenn ich mehr Zeit habe. Vorausgesetzt es gibt mir sonst niemand zuvor. :-D
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Lists - Verknüpfungen

Beitrag von Josh »

NicTheQuick hat geschrieben:Es kommt mir komisch vor, dass das hinten angehängt werden muss.
Ist aber leider so. Die Pb interne Struktur eines Listelementes schaut wie folgt aus:
  • Verweis auf das nächsten Listelement (normal für Benutzer nicht zugänglich)
  • Verweis auf das vorhergehende Listelement (nomal für Benutzer nicht zugänglich)
  • Dann folgt je nach Listdefinition ein Integer, die Benutzerstruktur oder sonst was
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Lists - Verknüpfungen

Beitrag von NicTheQuick »

Achso, ja. Genau so soll es doch sein. So macht man das mit LinkedLists normalerweise auch. Zuerst die Elementstruktur und danach die Benutzerdaten.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Lists - Verknüpfungen

Beitrag von STARGÅTE »

Wenn man @ListElement() macht, bekommt man die Adresse zur Struktur des Elements, der Header liegt dabei davor, mit Pointern zu NextElement, PrevElement und ListHeader.
Die Pointer für Vorgänger und Nachfolger leiten jedoch dann auf den Header des Elements, dort ist dann die Element-Struktur weiter hinten.

Weiterführende Themen:
Struktur von PBs LinkedLists. Richtig so?
Array in Structure, negative Felder so dauerhaft möglich
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
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Lists - Verknüpfungen

Beitrag von Josh »

NicTheQuick hat geschrieben:So macht man das mit LinkedLists normalerweise auch.
Es geht ja um LinkedLists :D

@Stargate
Danke für die Links


Habe meinen Code im ersten Beitrag noch mal ein wenig angepasst. Bin eigentlich ganz zufrieden, nur ohne die Codeverdoppelung für die Struktur wäre es halt noch besser. Wichtig für mich war natürlich auch, dass Autovervollständigen funktioniert, da kann ich mit der Codeverdoppelung auch leben.

Wie oben beschrieben, habe ich bis jetzt ja mit selber erstellten Feldern \Next und \Prev gearbeitet. Habe mal angefangen diese durch \NextItem und \PrevItem zu ersetzen. Puhhhh, hätte ich gar nicht gedacht, dass ich diese StrukturFelder meiner List im aktuellen Projekt über 800 mal verwende.
Antworten