[beendet]LinkedList - Addelement() - Bug?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

[beendet]LinkedList - Addelement() - Bug?

Beitrag von Toshy »

Hallo.

AddElement() hat einen Bug (Beta8). AddElement sollte nach dem hinzufügen eines neuen Elements dies zum aktuellen machen. Das tut es aber nicht. Ich habe vielleicht lange daran gerätselt was ich falsch mache, aber jetzt habe ich es wohl.

Code: Alles auswählen

Structure struct_ConnectionIDsAtClient
   ClientID.l
EndStructure
Global NewList LL_ConnectionIDsAtClient.struct_ConnectionIDsAtClient()

 *RowID = AddElement(LL_ConnectionIDsAtClient())
LL_ConnectionIDsAtClient()\ClientID = -4441
Debug "!!! LL_ConnectionIDsAtClient()\ClientID =" + Str(LL_ConnectionIDsAtClient()\ClientID  )
ChangeCurrentElement(LL_ConnectionIDsAtClient(),  *RowID )
Debug "!!! LL_ConnectionIDsAtClient()\ClientID =" + Str(LL_ConnectionIDsAtClient()\ClientID  )
Gruß
Thorsten
Zuletzt geändert von Toshy am 03.04.2006 03:13, insgesamt 2-mal geändert.
1. Win10
PB6.1
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Ach noch was.

Code: Alles auswählen

Structure struct_ConnectionIDsAtClient
   ClientID.l
EndStructure
Global NewList LL_ConnectionIDsAtClient.struct_ConnectionIDsAtClient()

 *RowID = AddElement(LL_ConnectionIDsAtClient())
LL_ConnectionIDsAtClient()\ClientID = -4441
Debug "!!! LL_ConnectionIDsAtClient()\ClientID =" + Str(LL_ConnectionIDsAtClient()\ClientID  )

ChangeCurrentElement(LL_ConnectionIDsAtClient(),  *RowID )
Debug "!!! LL_ConnectionIDsAtClient()\ClientID =" + Str(LL_ConnectionIDsAtClient()\ClientID  )


DeleteElement(LL_ConnectionIDsAtClient())
Ich kann zwar "anscheinend" mit changeCurrentElement() das aktuelle Element (das erste) wählen, aber der anschein trügt wohl. Denn nun kann ich mit deleteElement das aktuelle nicht mehr löschen. es kommt ein speicherzugriffsfehler.
1. Win10
PB6.1
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Tja, da hat sich wohl jemand die Hilfe zu ungenau angeguckt.
Da steht zwar "The value that this command returns is a pointer to the new element or zero if the new element could not be created." Aber danach steht auch noch "The structure of each element is shown below"
Der Rückgabewert ist nämlich nich ein Pointer auf deine Werte sondern der interne Pointer zum Element wobei da noch *NextElement und *PrevElement dazugehört.
Mit

Code: Alles auswählen

*RowID = AddElement(LL_ConnectionIDsAtClient())
ChangeCurrentElement(LL_ConnectionIDsAtClient(),  *RowID )
setzt du also den Pointer auf eine ungültige Stelle. Wenn du das so machen willst musste "*RowID = AddElement(LL_ConnectionIDsAtClient())+8" benutzen.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Oh doch, ich habe die Hilfe sehr genau angeschaut.
Ich hatte aber auch schon bemerkt, das es daran liegt, hatte nur noch keine Zeit hier zu schreiben.

Aber die Hilfe ist dann falsch. Denn das die Struktur wie angegeben aufgebaut ist, ändert nichts an der Tatsache das ChangeElement() einen Pointer zum Element will und AddElement() einen Pointer auf das Element zurückgibt.
Bei AddElement() steht ganz klar
Nur fr fortgeschrittene Anwender:
Der Wert, den dieser Befehl zurckgibt, ist ein Zeiger auf das neue Element, oder Null wenn das neue Element nicht erstellt werden konnte. Die Struktur jedes Elements wird nachfolgend dargestellt:
Es steht ganz klar, das der Rückgabewert der Pointer/Zeiger auf das neue Element ist. Punkt aus.

Und bei ChangeCurrentElement() steht deutlich
ndert das aktuelle Element der angegebenen Liste auf das angegebene neue Element '*NeuesElement'. Das neue Element muss ein Zeiger (Pointer) auf ein anderes in der Liste existierendes Element sein.
...
und da ändert auch nichts das man den Pointer mit "@ Operator in Verbindung mit dem Listenname " SOLLTE. Nichts von muß oder so.

Entweder arbeitet einer Befehle nicht so wie es sein sollte, denn es ist ja wohl sinnvoll das alle Befehle/Funktionen einer Kategorie auf gleicher Ebene arbeiten oder die Hilfe ist hier fehlerhaft.

Wie die Struktur einer Liste aufgebaut ist weiß ich nur ChangeCurrentElement() habe ich noch nicht genutzt. Das die Funktionen aber unterschiedlich arbeiten kann man nur erraten.

So bleibt einem nichts anderes überig bei den anderen Funktionen zu testen was sie zurückliefern (NextElement() usw.)

Ich fände es besser wenn man das angleichen würde, gerade wo jetzt eh eine neue "Hauptversion" von PB rauskommt, aber notwendig ist das natürlich nicht. Einzig die Hilfedatei sollte unbedingt erweitert werden, damit man das auch erkennen kann.
Selbst jetzt wo ich es (teilweise) schon weiß, kann ich beim besten Willen in die Hilfe nicht mal reininterpretieren, daß dies so gemeint "sein könnte" *g*

Gruß und Danke
Toshy
1. Win10
PB6.1
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Naja, die Hilfe ist in der Beziehung wirklich bisl undeutlich, allerdings steht da auch "Nur für fortgeschrittene Anwender", d.h. da muss irgendwie was besonderes sein. Richtig falsch ist es aber auch nicht, das was AddElement() zurückgibt ist ein Pointer auf des Element und @LL() auch. Das die sich jeweils um 8 Bytes unterscheiden ändert nichts an der Tatsache.

Also @Andre: Mach das mal bisl eindeutiger, damit sowas nich nochma passiert.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

@Deeem2031
Das stimmt natürlich.
Diese Begriffe "Richtig" und "Falsch" sind eh nie wirklich anwendbar, was für eine falsch ist, ist für den anderen richtig. Warscheinlich gab, gibt und wird es immer nur eine einzige Aussage geben welche diese Begriffe korrekt nutzt:

"Wenn, dann mache ich es richtig falsch!!!" *grins*

Wie du schon sagtest, beide Hilfeaussagen sind natürlich nicht wirklich falsch, aber wirklich verwirrend, da die selbe Aussage unterschiedliche Ergebnisse liefert.

Hatte es ja zum Glück auch noch selber rausgefunden (ist ein gutes Gefühl) bevor ich eure Post gelesen hatte. Aber jetzt habe ich dadurch natürlich ein neues Problem:
Ich kann mich nicht entscheiden ob ich die Version von "AddElement()" oder von "ChangeCurrentElement()" als Basis nehme. Speichere ich nun den einen Pointer und nehme für einige Routinen dann diesen +8 oder speichere den anderen und nutze dann für einige Routinen -8 ;-)
Hach, man hat ja nichts anders zu tun *grins*

Gruß
Toshy
1. Win10
PB6.1
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Ich würde immer den Pointer benutzen der auf den Inhalt zeigt, also AddElement()+8, weil der auch von jeder anderen Procedure benutzt wird und eigentlich auch der einzige ist den ein normaler Programmierer benutzt der nich unbedingt was an der LL intern ändern will.
Musst nur aufpassen das du den pointer nich schonwieder für "fortgeschrittene Zwecke" benutzt ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Gesperrt