Ich versuche gerade krampfhaft 2 komplette LinkedLists zu vertauschen ohne herumzutricksen. Ich bin mir ziemlich sicher, dass das mit PureBasic irgendwie geht und ich nur auf dem Schlauch stehe!
Mit Arrays geht das ja ganz einfach und problemlos:
Code: Alles auswählen
Dim a.s(1)
Dim b.s(1)
a(0) = "a0"
a(1) = "a1"
b(0) = "b0"
b(1) = "b1"
Swap a(), b()
Debug "== a =="
Debug a(0)
Debug a(1)
Debug "== b =="
Debug b(0)
Debug b(1)
Im Moment zweckentfremde ich MergeLists() und SplitList() um das gewünschte Ergebnis zu erhalten, allerdings bin ich generell kein Freund von Zweckentfremdungen und außerdem - wie gesagt - bin ich der Überzeugung dass PureBasic das doch irgendwie von Haus aus können muss!
Code: Alles auswählen
Macro SwapLists(ListA, ListB)
FirstElement(ListA)
MergeLists(ListB, ListA, #PB_List_Before)
SplitList(ListA, ListB, #False)
EndMacro
NewList a.s()
NewList b.s()
AddElement(a()): a() = "a0"
AddElement(a()): a() = "a1"
AddElement(b()): b() = "b0"
AddElement(b()): b() = "b1"
SwapLists(a(), b())
Debug "== a =="
ForEach a()
Debug a()
Next
Debug "== b =="
ForEach b()
Debug b()
Next
- Ich kann aus dem Macro keine Prozedur stricken, da dies eine Beschränkung des Datentypes mit sich bringen würde.
- Im Vergleich zum Swap (wie beim Array) geht etwas an Performance verloren (wenn auch minimal - 3 Prozeduraufrufe mit insg. 7 Parameterübergaben ist langsamer als das Vertauschen von zwei Zeigern).
Um der Frage "Wozu das ganze überhaupt?" vorwegzugreifen: Ich habe eine Prozedur in welcher ich recht komplizierte (im Sinne von "unübersichtliche") Aktionen mit einer als Parameter übergebenen Liste durchführe. Einzelne Elementinhalte werden verändert und gleichzeitig deren Position innerhalb der Liste. Der Einfachheit zu liebe erstelle ich eine zweite lokale Liste, verschiebe jedes abgearbeitete Element in diese zweite Liste und vertausche vor dem Prozedurenende die beiden Listen, was gleichzeitig dazu führt, dass überflüssige Elemente in der lokalen Liste landen und automatisch freigegeben werden.