SwapList(List())

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

SwapList(List())

Beitrag von Scarabol »

Hi Leute,

hab mir schnell einen Code geschrieben mit dem ich eine komplette Liste umdrehen kann als das erste Element als letztes, das zweite als vorletztes und umgekehrt natürlich.

Was muss ich machen, damit der Code auch mit strukturierten Listen fertig wird oder muss ich für jede Struktur einen eigenen Code haben?

Gruß
Scarabol

PS Hier noch der Code

Code: Alles auswählen

Procedure SwapList(List())
  Protected c, i, *s1, *s2
  c = CountList(List())-1
  For i = 0 To Int(c/2)
    SelectElement(List(), i)
    *s1 = @List()
    SelectElement(List(), c-i)
    *s2 = @List()
    SwapElements(List(), *s1, *s2)
  Next
EndProcedure


NewList test()

For i = 1 To 3
  AddElement(test())
  test() = i
Next

ForEach test()
   Debug test()
Next

SwapList(test())

ForEach test()
  Debug test()
Next
2. Wird der Speicher der Protected Variablen am Ende der Procedure wieder freigegeben?
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> 2. Wird der Speicher der Protected Variablen am Ende der Procedure wieder freigegeben?
Ja, einzige Ausnahme ist AllocateMemory, da wird nur der Zeiger ungültig!!!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: SwapList(List())

Beitrag von PureLust »

Scarabol hat geschrieben:Was muss ich machen, damit der Code auch mit strukturierten Listen fertig wird ...
Probier's doch einfach aus.
Da meines Wissens nach bei einem SwapElement() nur die Zeiger auf die Elemente ausgetauscht werden sollte das auch genau so bei strukturierten Elementen klappen.

Tip: Eigentlich sollte ein Umdrehen der LList-Reihenfolge auch schneller zu realisiern sein als durch die von Dir verwendete Methode.
Du bräuchtest im Grunde nur den Start-Zeiger der Liste auf das letzte Element zu setzen und dann bei jedem Element einfach die Prev/Next-Zeiger umzudrehen.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Probier's doch einfach aus. ...
Hab ich daher die Frage, vom Compiler heißt es nur LL passt nicht zu den Parametern.

Zu deinem Tip:
Wie kann ich den Startzeiger ändern?
und dann so weitermachen?

Code: Alles auswählen

Procedure SwapList2(List())
  ForEach List()
    Swap List()\*Previous, List()\*Next
  Next
EndProcedure

Allerdings bekomm ich dann den Fehler das die Liste keine Struktur hat, die sie wiederum nach der Hilfe zu Addelement schon aufweisen sollte.

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Swap funktioniert definitiv nicht mit strukturen, nur mit nativen typen.

die Help mag da leicht mißverständlich erscheinen:
Vertauscht ("swap") den Wert der beiden Ausdrücke, auf eine optimierte Art und Weise. Beide Parameter <Ausdruck> müssen eine Variable, ein Array- oder ein LinkedList-Element (strukturiert oder nicht) sein und müssen in einem nativen PureBasic Typ wie Long (.l), Quad (.q), String, etc. vorliegen.
das "strukturiert" hier bezieht sich auf die natur der liste.
das ende des satzes ist maßgeblich für den typ des einzelnen elementes.
das funktioniert also:

Code: Alles auswählen

Structure test
  x.l
  y.l
EndStructure

bla.test
bla\x = 13
bla\y = 27

Swap bla\x, bla\y

Debug bla\x
Debug bla\y
hier werden native typen innerhalb einer struktur getauscht.

[edit]
ach ok... SwapElements()... da hab ich wohl was überlesen...
[/edit]


die idee, die previous/next pointer zu vertauschen ist ja ganz nett,
allerdings muss man ja auch in der lage sein,
diesen vorgang in einer schleife abzuhandeln.

also müßte man wohl beim letzten element anfangen,
dort previus und next vertauschen,
dann NextElement(), womit man beim vorletzten landet,
und so weiter die liste rückwärts durchgehen indem man vorwärts-befehle benutzt.
Zuletzt geändert von Kaeru Gaman am 03.08.2007 16:56, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Scarabol hat geschrieben:
Probier's doch einfach aus. ...
Hab ich daher die Frage, vom Compiler heißt es nur LL passt nicht zu den Parametern.
Hier mal das SwapElements()-Beispiel aus der PB-Hilfe, welches ich einfach mal auf eine strukturierte LL umgestellt habe:

Code: Alles auswählen

  NewList Numbers.POINT()
  
  For k=0 To 10
    AddElement(Numbers())
    Numbers()\x = k
  Next
    
  SelectElement(Numbers(), 3) ; Auswählen des vierten Elements (beachte: es gibt auch ein 0-tes Element)
  *FirstElement = @Numbers()
  
  SelectElement(Numbers(), 9) ; Auswählen des zehnten Elements (beachte: es gibt auch ein 0-tes Element)
  *SecondElement = @Numbers()
  
  ; Tausche die 3 mit der 9
  ;
  SwapElements(Numbers(), *FirstElement, *SecondElement)
    
  ; Überprüfen des Ganzen
  ;
  ForEach Numbers()
    Debug Numbers()\x
  Next
Wie Du siehst funktioniert SwapElements() auch mit strukturierten Listen. ;)

Gruß, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Hehe du Witzbold bei mir funktioniert es ja nicht, weil ich es in einer Procedure aufrufe, womit wir auch wieder beim Thema währen ich möchte der Procedure ja klar machen das ich eine strukturierte Liste hab.

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Scarabol hat geschrieben: ich möchte der Procedure ja klar machen das ich eine strukturierte Liste hab.
Dann solltest Du in der Prozedurdeklaration aber auch die Struktur der Liste mit angeben (Bsp. von ts-soft).

(Ich bin aber gerade dran, eine universelle FlipLingedList()-Prozedur zu machen ... mom.)
Zuletzt geändert von PureLust am 03.08.2007 17:34, insgesamt 1-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Scarabol hat geschrieben:Hehe du Witzbold bei mir funktioniert es ja nicht, weil ich es in einer Procedure aufrufe, womit wir auch wieder beim Thema währen ich möchte der Procedure ja klar machen das ich eine strukturierte Liste hab.

Gruß
Scarabol
Entweder Global, Shared oder als Parameter übergeben

Code: Alles auswählen

Procedure bla(mystructlist())

EndProcedure
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Ok danke, ich warte, aber schonmal im Voraus im Beispiel von TS wurde die Struktur ja mit angegeben, ich möchte hierrauf jedoch verzichten und die Procedure universell gestalten.

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Antworten