LinkedLists mal anders

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.

Welcher Meinung seit ihr, wie LinkedLists ermöglich werden sollen?

Die Aktuelle Methode von PureBasic (also via "NewList")
16
67%
Mein Vorschlag (Dynamische Variante)
6
25%
Hauptsache die LinkedLists sind irgendwie möglich (Brauche keine Datenbäume)
1
4%
Mir ist es egal. Habe sie noch nie wirklich genutzt...
1
4%
 
Insgesamt abgegebene Stimmen: 24

Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

STARGÅTE hat geschrieben: Ich kann es höhstens mit ReDim noch mal größer oder kleiner machen, das ist aber in meinen Augen nicht Dynamisch ...
Doch, genau das ist ein dymaisches Array. In Structures geht das nicht, da in Structures das Array so im Speicher der Structure steht. Also nicht als Pointer. Dementspechend kann das Array auch nicht vergrößert oder verkleinert werden.
ts-soft hat geschrieben:dynamische Arrays gehen doch in strukturen. Dafür gibts doch [0]
Nur den Speicher muß ich gegebenenfalls allokieren.
Das andere kann man sehr komfortabel mit XML im Speicher machen, wenn
auch nicht ganz so schnell.
Wäre mir neu, dass das geht. Kannst du mir mal ein Beispiel dazu geben. Weil dann müsste ein mit [0] dimensioniertes Array in einer Structure als Pointer in der Structure stehen.

Zu XML im Speicher sag ich jetzt mal nix. :?
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Weil dann müsste ein mit [0] dimensioniertes Array in einer Structure als Pointer in der Structure stehen
jo das wäre doch das was eh in diesem Thema gewünscht ist.

also mit Pointern arbeiten und alles so dynamisch lassen , deswegen meinte ja TS das es schon geht
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
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 »

> Kannst du mir mal ein Beispiel dazu geben

Code: Alles auswählen

Structure ABYTE
  b.b[0]
EndStructure

Structure TEST
  Data1.l
  Data2.s
  *DynamicMem.ABYTE
EndStructure

atest.TEST

atest\DynamicMem = AllocateMemory(30)

For i = 0 To 29
  atest\DynamicMem\b[i] = i + 47
Next

OpenConsole()

PrintN(PeekS(atest\DynamicMem))
PrintN(Str(SizeOf(test)))
Input()

CloseConsole()
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
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Ah, sehr sehr nice. :allright: Danke
Das sollte unbedingt in die Doku aufgenommen werden.

Allerdings bin ich immernoch der Meinung das PB das ohne Umweg unterstützen sollte. Also entweder mit ReDim, welches man auf Strukturfelder anwenden kann. Müssen dann aber natürlich von den statischen unterschieden werden. Sollte ja kein Problem sein durch die unterschiedlichen Klammern. Oder halt als Pointer (wie im Startpost beschrieben) aber direkt.
Also in dem Sinne:

Code: Alles auswählen

Structure TEST
  Data1.l
  Data2.s
  *DynamicArray.b(50)
EndStructure
ReDim hätte den Vorteil das SizeOf stimmen würde.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Thorium dein Code führt hier aber zur Doppeldeutung denn:

Man weiß ja nun hier nicht ob du ein Array mit 50 Pointern anlegen willst die auf 1 Byte zeigen.
Oder ob du 1 Pointer haben willst, welcher zu einem Array mit 50 Bytes zeigt.

deins wäre nämlich (mit [] statt () ) ein Array mit Pointern (also 4bzw.8Byte)
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
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

STARGÅTE hat geschrieben:Thorium dein Code führt hier aber zur Doppeldeutung denn:

Man weiß ja nun hier nicht ob du ein Array mit Pointern anlegen willst die auf ein Byte zeigen.
Oder ob du ein Pointer haben willst, welcher zu einem Arary mit Bytes zeigt.

deins wäre nämlich (mit [] statt () ) ein Array mit Pointern (also 4bzw.8Byte)
Arg, richtig.
Ok dann lassen wir das mit den Pointern und nehmen ReDim. Halte ich sowieso für besser. Wird im Hintergrund sowieso das gleiche gemacht.

Also so in etwa:

Code: Alles auswählen

Structure TEST
  Data1.l
  Data2.s
  DynamicArray.b(50)
EndStructure 

Global Test.TEST

ReDim Test\DynamicArray.b(100)
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

jo das würde ich auch gut finde, das NewList und Dim nicht mehr Fest wäre sonder "überall zu jeder Zeit" verwendet werden können.
und alles wäre Super.

zu schreiben hätte man dann bei SchachtelArrays:
AussenArray(3,1)\InnenArray(9,3)\Structure\Long

oder halt bei LLs:
AddElement(AussenListe()\InnenListe())

usw.
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
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Thorium hat geschrieben:

Code: Alles auswählen

Structure TEST
  Data1.l
  Data2.s
  DynamicArray.b(50)
EndStructure
ReDim hätte den Vorteil das SizeOf stimmen würde.
Nur dass SizeOf eine Compiler-Funktion ist! ... Der Wert von SizeOf wird also zur Compile-Zeit und nicht zur Laufzeit bestimmt!

cu, guido
Zuletzt geändert von helpy am 17.11.2008 10:53, insgesamt 1-mal geändert.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Also ich wünsche mir schon seit jahren eine LINKEDList dynamisch zu erstellen.
Also ob man es nun "x = createLinkedList" oder "x = newlist()" nennt ist egal. An den LinkedList muss an sich nix geändert werden von ihrer art her, nur das man sie halt wie heir gemeint dynamisch erstellen und löschen kann.


Noch was. zu:
ts-soft hat geschrieben:> Kannst du mir mal ein Beispiel dazu geben

Code: Alles auswählen

Structure ABYTE
  b.b[0]
EndStructure

Structure TEST
  Data1.l
  Data2.s
  *DynamicMem.ABYTE
EndStructure

atest.TEST

atest\DynamicMem = AllocateMemory(30)

For i = 0 To 29
  atest\DynamicMem\b[i] = i + 47
Next

OpenConsole()

PrintN(PeekS(atest\DynamicMem))
PrintN(Str(SizeOf(test)))
Input()

CloseConsole()
Soweit ich m ich erinnere geht das nicht wirklich gut.
Ich hatte damals sogar eine eigene Routine geschriebe die eine einfache Variane der LinkesList erstellt. Das Große Problem ist nur, das wenn man allocatememory nutzt und den speicher wieder frei gibt, nicht alles freigegeben wird wenn man strings in der structure verwendet.
Über Assambler koennte man das glaube ich zwar irgendwie uebergehen,a ber ganz genau weiß ich es nicht mehr.

Zurück zum Thema.
Wie schon gesagt, mit dynamischen LinkedList könnte man wunderbar diese Datenbäume erstellen. Man kann das zwar alles kompliziert umgehen, indem man eine Linkedlist manipuliert oder eine Art Index nutzt von wo bis wo in einer LinkedList eine sagen wir mal "virtuelle LinkedList" beginnt, aber besonders schön ist es nicht.

Ich hab das auch schon vor langem mal vorgeschlagen. Falls es einges Tages kommt, wunderbar :-)
1. Win10
PB6.1
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Toshy hat geschrieben:Das Große Problem ist nur, das wenn man allocatememory nutzt und den speicher wieder frei gibt, nicht alles freigegeben wird wenn man strings in der structure verwendet.
Mit PB4.20 funktioniert das bei mir ...
... wie es mit PB4.30 aussieht weis ich aber noch nicht.
http://www.purebasic.fr/english/viewtopic.php?t=30520

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten