AddElement in neuer PB-Version 4.30Beta2

Für allgemeine Fragen zur Programmierung mit PureBasic.
lapo
Beiträge: 32
Registriert: 12.10.2004 13:36

AddElement in neuer PB-Version 4.30Beta2

Beitrag von lapo »

Hallo!

Ich verwende die LinkedList intensiv in meinen Programmen.
Beispielsweise lese ich Datensätze aus einer SQL-Datenbank in eine LinkedList ein. Die Datenfelder habe ich in einer Structure definiert, die ich mit der LinkedList verbinde (siehe Code).

Code: Alles auswählen

Structure tdbTabelle1
  Feld1[3]
  Feld2.l
  Feld3.q
EndStructure

Global NewList Tabelle1.tdbTabelle1()
Diese Funktionalität findet in einer PB-DLL statt. Innerhalb eines Programmes, welches in einer anderen Programmiersprache geschrieben wurde, binde ich diese DLL für Datenbankzugriffe ein.
Von diesem Programm rufe ich Funktionen in der DLL auf um Datensätze zu lesen/schreiben etc.. Nachdem die Datensätze innerhalb der DLL gelesen wurde übergebe ich diese dem Programm. Anschließend bewege ich mich aus dem Programm in den einzelnen Elementen der LinkedList über die Adressen *Next.Element und *Previous.Element vor und zurück. Hierdurch kann ich auf einfache Weise auf die gelesenen Datensätze Zugriif.

Ab der Version 4.3 soll die Struktur der LinkedList (siehe unten) geändert werden. Bei AddElement soll nun die Adresse des neuen Elementes ausgegeben werden.

Code: Alles auswählen

Nur für fortgeschrittene Anwender: 
Der Wert, den dieser Befehl zurückgibt, ist ein Zeiger auf das neue Element, oder Null wenn das neue Element nicht erstellt werden konnte. Die Struktur jedes Elements wird nachfolgend dargestellt: 

Structure Element
    *Next.Element        ; Zeiger auf das nächste Element in der Liste oder Null, wenn es das letzte Element ist
    *Previous.Element    ; Zeiger auf das vorherige Element in der Liste oder Null, wenn es das erste Element ist
  
    ; Die Datentypen des Anwenders, mit denen die Liste erstellt wurde, folgen nach diesen
    ; zwei Variablen (was bedeutet, das die Anwenderdaten wie folgt gefunden werden können:
    ; Adresse des neuen Elements + 8
EndStructure 
Die Verwendung der Pointer innerhalb der Elemente einer LinkedList war doch genauso so frei gegeben und konnte bzw. durfte verwendet werden. Das gesamte Konzept meiner Anwendungen werden über den Haufen geworden - das kann doch nicht sein!
Gibt es eine andere Lösung, die bereits bekannt ist?

Grüße

Ralf[/b]
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Ich verstehe nicht wo du da ein Problem siehst?
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

dies ist keine Ankündigung: Verschoben nach "Allgemein"


@Topic

so weit ich das sehe, wurde da nix verändert...
die Elemente einer Liste haben schon immer die Previous- und Next-Pointer enthalten.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ich weiß wo das problem liegt :

SituationsCode :

Code: Alles auswählen

NewList Test.l()

*P = AddElement(Test())
Test() = 120

Debug PeekL(*P+0)
Debug PeekL(*P+4)
Debug PeekL(*P+8)
Unter 4.20:
0 < vorgänger
0 < nachfolger
120 < Elementinhalt
Unter 4.30:
120 < Elementinhalt
0 < ...
0 < ...
under 4.30 ist der zurückgegebene Pointer selber schon der Inhalt des Elements und nicht erst 8 Byte später wie in 4.2

Das ist in der Tat eine große umstellung ...

@lapo: du müsstest wahrscheinlich nun immer -8Byte rechnen ... um auf die Position von 4.20 zu kommen (bzw -16Byte bei 64bit)
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

verstehe.

also:

Code: Alles auswählen

*Next = PeekI( *P -2* SizeOf(i) )
*Previous = PeekI( *P - SizeOf(i) )
aber so ein ähnliches Problem haben schon so manche Kollegen gehabt bei Updates.

da heißt es dann, entweder das Projekt in der alten Stable-Version abschließen, oder konvertieren wie ein Weltmeister.
es zwingt einen ja keiner, mit der 4.3 weiter zu machen, zumal die eh noch Beta ist, da sollte man sowieso beide versionen parallel installiert haben.

das war bei der Umstellung 3.9x -> 4.0 eine echte Arie, da ist dieses hier geradezu harmlos.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

äää

3.3 -> 4.10 ist hart ^^
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
lapo
Beiträge: 32
Registriert: 12.10.2004 13:36

Beitrag von lapo »

Hallo!

dies ist keine Ankündigung: Verschoben nach "Allgemein"
@Kaeru Gaman: Hatte zu schnell auf den Button geklickt und bin deshalb nicht da, da hingekommen wo ich hin wollte. Danke für's verschieben... ;-)


@All: Danke für Eure Antworten...

Irgendwie muß PB sich selber die Verkettung der einzelnen Elemente merken. Gibt es ab 4.3 keinen offiziellen Weg mehr daran? Wenn denn das nicht mehr so ist, muß man/ich die Verpointerung selber durchführen. Besser man baut sich dann selber eine verkettete Liste mit den Werten, die man selber benötigt und bemüht dazu die Windows-API...

Hat irgendjemand einen direkten Drath zu dem engeren Entwicklerkreis und könnte vielleicht einmal nachhören? Das wäre super...

Grüße

Ralf
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

es ist ja nix verschwunden...
sondern es wird nur ein anderen Pointer zurückgegeben :

in 4.30 kommst du so an die vorgänger und nachfolger :

Code: Alles auswählen

NewList Test.l()

*P1 = AddElement(Test())
Test() = 110
*P2 = AddElement(Test())
Test() = 120
*P3 = AddElement(Test())
Test() = 130

Debug PeekL(*P2-8)
Debug PeekL(*P2-4)
Debug PeekL(*P2+0)
halt mit -8 und -4 und das Element 0
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
lapo
Beiträge: 32
Registriert: 12.10.2004 13:36

Beitrag von lapo »

Hallo STARGÅTE,

danke für die Info.

Dann habe ich das falsch verstanden gehabt... :-(
Dann kann ich ja für mich Entwarnung geben. Ich dachte halt, daß nur noch der Wert vorhanden ist, aber die Adressen des vorherigen bzw. nachfolgenden Elementes "verschwunden" sind.

Im Klartext bedeutet dies, daß die eigentliche Struktur des Elementes einer LinkedList erhalten geblieben ist und lediglich anstatt des Pointers auf den Inhalt nun der Pointer auf das eigentliche Datenelement zurückgegeben wird....

O.K. - werde mir das mal im Programm bei mir genauer anschauen.

Grüße

Ralf
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 »

Ich denke mal diese Variante (von Kaeru bereits angedeutet):

Code: Alles auswählen

NewList Test.l()

*P1 = AddElement(Test())
Test() = 110
*P2 = AddElement(Test())
Test() = 120
*P3 = AddElement(Test())
Test() = 130

Debug PeekL(*P2-(2 * SizeOf(Integer)))
Debug PeekL(*P2-SizeOf(Integer))
Debug PeekL(*P2)
ist korrekter
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
Antworten