Seite 1 von 2

AddElement in neuer PB-Version 4.30Beta2

Verfasst: 24.09.2008 14:07
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]

Verfasst: 24.09.2008 14:41
von Batze
Ich verstehe nicht wo du da ein Problem siehst?

Verfasst: 24.09.2008 14:58
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.

Verfasst: 24.09.2008 15:10
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)

Verfasst: 24.09.2008 15:27
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.

Verfasst: 24.09.2008 16:53
von STARGÅTE
äää

3.3 -> 4.10 ist hart ^^

Verfasst: 24.09.2008 17:33
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

Verfasst: 24.09.2008 17:39
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

Verfasst: 24.09.2008 17:57
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

Verfasst: 24.09.2008 17:57
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