Rückgabe von DeleteElement() zuverlässig?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Rückgabe von DeleteElement() zuverlässig?

Beitrag 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
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rückgabe von DeleteElement() zuverlässig?

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Rückgabe von DeleteElement() zuverlässig?

Beitrag 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!
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Rückgabe von DeleteElement() zuverlässig?

Beitrag 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...
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Rückgabe von DeleteElement() zuverlässig?

Beitrag von NicTheQuick »

Ich kriege unter Linux x64 auch den Fehler beim letzten 'DeleteElement()', dass kein aktuelles Element vorhanden wäre.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rückgabe von DeleteElement() zuverlässig?

Beitrag 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().
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Rückgabe von DeleteElement() zuverlässig?

Beitrag 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... :oops:
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten