Seite 1 von 2

Elemente ans ende der Liste Hinzufügen

Verfasst: 20.02.2005 12:51
von Lukaso
Hallo,

ich bräuchte ne möglichkeit, unabhängig von der aktuellen Position (NextElement() etc..) neue Elemente ans ende der Liste Hinzuzufügen, ohne die Position zu verändern.

Ich könnte ja mit LastElement() ans ende Springen, und meine Elemente hinzufügen und wieder zurückspringen, dass problem ist aber, dass ich im Programm mehrere gleichzeitige Lesevorgänge habe und so alles durcheinander kommen könnte.

Danke für eure Hilfe! :allright:

MFG Lukaso

Verfasst: 20.02.2005 12:55
von DarkDragon
Du könntest die Liste aller aller höchstens durch LLHandle funktionen bearbeiten.

Verfasst: 20.02.2005 14:52
von NicTheQuick
Ohne Kommentare...

Code: Alles auswählen

NewList LinkedList.l()

Procedure AddElementAfterLastWithValue(a.l)
  Protected *Mem
  *Mem = @LinkedList()
  If LastElement(LinkedList())
    If AddElement(LinkedList())
      LinkedList() = a
    EndIf
  EndIf
  ChangeCurrentElement(LinkedList(), *Mem)
EndProcedure

AddElement(LinkedList())
LinkedList() = 1

AddElementAfterLastWithValue(10)
AddElementAfterLastWithValue(44)
AddElementAfterLastWithValue(145)

Debug LinkedList()
Debug ""
ForEach LinkedList()
  Debug LinkedList()
Next

Verfasst: 20.02.2005 15:03
von Lukaso
@NicTheQuick

Danke :allright:

Könntest du mir bitte mal das Fettgedruckte erklären?
Procedure AddElementAfterLastWithValue(a.l)
Protected *Mem
*Mem = @LinkedList()
If LastElement(LinkedList())
If AddElement(LinkedList())
LinkedList() = a
EndIf
EndIf
ChangeCurrentElement(LinkedList(), *Mem)
EndProcedure
Will nich dumm sterben :roll:

Danke Lukaso :allright:

Verfasst: 20.02.2005 15:13
von freedimension
Procedure AddElementAfterLastWithValue(a.l)
Protected *Mem
*Mem = @LinkedList() ;Der Zeiger auf das aktuelle Element der Liste wird in *Mem gespeichert
If LastElement(LinkedList())
If AddElement(LinkedList())
LinkedList() = a
EndIf
EndIf
ChangeCurrentElement(LinkedList(), *Mem) ; die ursprüngliche Position der Liste wird mit Hilfe des zwischengespeicherten Zeigers wieder hergestellt
EndProcedure

Verfasst: 20.02.2005 15:15
von NicTheQuick
Das steht ja im Grunde schon in der Hilfe.
Mit [c]*Mem = @LinkedList()[/c] wird der Zeiger zum aktuellen Element genommen und in [c]*Mem[/c] gespeichert.
Der Befehl [c]ChangeCurrentElement()[/c] wählt dann wieder das Element mit dem Zeiger [c]*Mem[/c] aus und macht es zum aktuellen.

Mir ist allerdings vorhin aufgefallen, dass das ganze nicht mehr so wunderbar funktioniert, wie es früher mal der Fall war. Wäre nämlich bei Aufruf der Procedure kein aktuelles Element da, würde die Zeile [c]*Mem = @LinkedList()[/c] fehlschlagen. Ich glaube bei PB V3.90 hat das noch funktioniert. Da war [c]*Mem = 8[/c] und [c]ChangeCurrentElement(LinkedList(), 8)[/c] hat die LinkedListe dann resettet.

Verfasst: 20.02.2005 15:20
von Lukaso
Danke für die Erklärung!

Ist das eigentlich schneller wie mit ListIndex() und SelectElement()?

Desweiteren stürtzt mir der Code mit Strings ab ....

Code: Alles auswählen

NewList LinkedList.s()

Procedure AddElementAfterLastWithValue(a.s) 
  Protected *Mem 
  *Mem = @LinkedList() 
  If LastElement(LinkedList()) 
    If AddElement(LinkedList()) 
      LinkedList() = a
    EndIf 
  EndIf 
  ChangeCurrentElement(LinkedList(), *Mem)
EndProcedure 

AddElement(LinkedList()) 
LinkedList() = "FLUMP" 

AddElementAfterLastWithValue("BLA1")
AddElementAfterLastWithValue("BLA2")
AddElementAfterLastWithValue("BLA3") 

Debug LinkedList() 
Debug "" 
ForEach LinkedList() 
  Debug LinkedList() 
Next
Ansonsten Danke!

MFG Lukaso

Verfasst: 20.02.2005 15:23
von NicTheQuick
Wenn das mit Strings abstürzt, kann das nur ein PB-Bug sein.

Verfasst: 20.02.2005 16:41
von Andre
NicTheQuick hat geschrieben:Wenn das mit Strings abstürzt, kann das nur ein PB-Bug sein.
Habs mal an Fred gemeldet.

Verfasst: 20.02.2005 18:29
von Andre
Ok, Rückantwort von Fred ging schnell:
Fred hat geschrieben: That's because a @LinkedList of string type returns the string address. I will change that for the next beta.
Das obige Verhalten resultiert also daraus, dass bei Verwendung von @LinkedList auf den Stringtyp auch die String-Adresse zurückgegeben wird. Er wird's für die nächste Beta ändern... :wink: