Seite 2 von 3

Verfasst: 16.11.2008 20:41
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. :?

Verfasst: 16.11.2008 21:10
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

Verfasst: 16.11.2008 21:14
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()

Verfasst: 16.11.2008 21:27
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.

Verfasst: 16.11.2008 21:33
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)

Verfasst: 16.11.2008 21:36
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)

Verfasst: 16.11.2008 21:42
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.

Verfasst: 16.11.2008 21:50
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

Verfasst: 16.11.2008 23:50
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 :-)

Verfasst: 17.11.2008 00:14
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