Seite 1 von 1

Lists - Verknüpfungen

Verfasst: 14.05.2019 00:41
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.

Re: Lists - Verknüpfungen

Verfasst: 14.05.2019 09:47
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.

Re: Lists - Verknüpfungen

Verfasst: 14.05.2019 12:02
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.

Re: Lists - Verknüpfungen

Verfasst: 14.05.2019 12:53
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:

Re: Lists - Verknüpfungen

Verfasst: 14.05.2019 13:15
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

Re: Lists - Verknüpfungen

Verfasst: 14.05.2019 13:42
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

Re: Lists - Verknüpfungen

Verfasst: 14.05.2019 13:46
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.

Re: Lists - Verknüpfungen

Verfasst: 14.05.2019 13:47
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

Re: Lists - Verknüpfungen

Verfasst: 14.05.2019 14:38
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.