Seite 1 von 1
Rückgabe von DeleteElement() zuverlässig?
Verfasst: 15.10.2013 01:24
von Regenduft
Morgähn,
mir ist gerade per Zufall aufgefallen, dass
DeleteElement() immer einen Wert ungleich Null rückgibt, außer es wird das letzte Element gelöscht oder die Liste ist bereits leer. Allerdings steht in der
PB-Hilfe zu DeleteElement(), dass offiziell
kein Wert rückgegeben wird. Daher die Frage:
Weiß vielleicht jemand, ob dieses Verhalten zuverlässig ist? Wäre nämlich ganz nützlich...
Code: Alles auswählen
NewList a()
Debug AddElement(a()) ; = 31202064
Debug AddElement(a()) ; = 31202096
Debug AddElement(a()) ; = 31202128
Debug ""
Debug DeleteElement(a()) ; = 31202112
Debug DeleteElement(a()) ; = 31202080
Debug DeleteElement(a()) ; = 0
Debug ""
Debug DeleteElement(a()) ; = 0
Re: Rückgabe von DeleteElement() zuverlässig?
Verfasst: 15.10.2013 01:37
von STARGÅTE
Das erste DeleteElement() löscht aber in deinem Beispiel gerade das letzte Elemente zuerst.
Es ist also genau andersrum.
So wie ich das erkenne, gibt DeleteElement() die Headeradresse (Also *Element - 2*IntegerSize) des (nach dem löschen) aktuellen Elements zurück.
Wird das erste oder keins gelöscht, ist das aktuelle nicht definiert, also 0
Code: Alles auswählen
NewList a()
Debug AddElement(a()) ; = xxx100
Debug AddElement(a()) ; = xxx200
Debug AddElement(a()) ; = xxx300
Debug ""
FirstElement(a())
Debug DeleteElement(a()) ; = 0
FirstElement(a())
Debug DeleteElement(a(), 1); 1 bedeutet nicht ins leere springen ; = Pointer des ursprünglich 3. Elements: xxx292
Debug DeleteElement(a()) ; = 0 keine Elemente mehr da.
Debug ""
Da dieses Verhalten also durchaus logisch ist, sollte es auch zuverlässig sein, zumindest bis auf weiteres
Re: Rückgabe von DeleteElement() zuverlässig?
Verfasst: 15.10.2013 02:06
von Regenduft
Danke für die detaillierte Antwort!
Da hatte ich mich mal wieder sauber ausgedrückt... Ich meinte mit "letztes Element" das "letzte verbleidende Element". Gut, dass Du erkannt und darauf hingewiesen hast (und auch noch sauber belegt), dass es sich (sozusagen) nur darum handelt, ob es nach dem löschen noch ein aktuelles Element gibt!
Re: Rückgabe von DeleteElement() zuverlässig?
Verfasst: 15.10.2013 12:54
von matbal
Der Rückgabewert ist wohl auch vom Betriebssystem bzw. dem PBCompiler abhängig.
Unter WinXP 32bit gibt bei mir jedes erfolgreiche DeleteElement den gleichen Wert zurück. Das vierte DeleteElement im obersten Code bringt einen Fehler: "Die LinkedList hat kein aktuelles Element"
In der Hilfe ist der Rückgabewert ja auch nicht dokumentiert...
Re: Rückgabe von DeleteElement() zuverlässig?
Verfasst: 15.10.2013 13:51
von NicTheQuick
Ich kriege unter Linux x64 auch den Fehler beim letzten 'DeleteElement()', dass kein aktuelles Element vorhanden wäre.
Re: Rückgabe von DeleteElement() zuverlässig?
Verfasst: 15.10.2013 14:05
von STARGÅTE
Jo, den Fehler bekommen alle.
Aber man kann ihn halt verhinden, indem man vorher testet, ob das letztere DeleteElement noch ein aktuelles Element hinterlassen hat oder nicht.
Klar geht das auch mit ListIndex().
Re: Rückgabe von DeleteElement() zuverlässig?
Verfasst: 15.10.2013 16:47
von Regenduft
matbal hat geschrieben:Unter WinXP 32bit gibt bei mir jedes erfolgreiche DeleteElement den gleichen Wert zurück.
Huch?! Wohl zu früh gefreut...
Ich bekomme nur "Die LinkedList hat kein aktuelles Element" nur als Debugger-Warnung, nicht aber als Fehler...
Ich hatte die Frage übrigens nur gestellt, WEIL der Rückgabewert nicht dokumentiert ist...
Folgendes ist z.B. auch nicht dokumentiert, aber "offiziell vom PB-Team abgesegnet":
Code: Alles auswählen
Structure StringCharArray
s.s{1}[0]
EndStructure
foo$ = "ab#xy"
*s.StringCharArray = @foo$ + SizeOf(Character) * 2
Debug *s\s[-2]
Debug *s\s[-1]
Debug *s\s[0]
Debug *s\s[1]
Debug *s\s[2]
Nachtrag:
Hier noch das offizielles Statement von Freak: Rückgabewert nicht zuverlässig!
Ja... ich war ein wenig flott mit dem Feature Request...
