Seite 1 von 1

Beispiele zu neuen Funktionen in PB 4.50

Verfasst: 01.04.2010 15:12
von STARGÅTE
Tachchen,

Es gibt ja nun Listen in Strukturen, also habe ich mal versuch diese FUnktion für ganze Baumstrukturen zu nutzen.

Es ist zwar nach wie vor verboten Rekursive Strukturen zu bauen:

Code: Alles auswählen

Structure Tree
  List SubTree.Tree()
EndStructure
Aber man kann ja nun eine Liste auch mit Pointern erzeugen, und mit den nötigen Hilfsmitteln kann mna ein Baum bauen:

Vorinformation über die Größe von Listen in Structuren:

Code: Alles auswählen

Structure StructureList1
  List *Child()
EndStructure

Structure StructureList2
  List Child.s()
EndStructure

Structure SubStructure
  Long.l
  Byte.b
  Quad.q
EndStructure

Structure StructureList3
  List Child.SubStructure()
EndStructure

Debug SizeOf(StructureList1)
Debug SizeOf(StructureList2)
Debug SizeOf(StructureList3)
wie man sieht hat diese immer 8 Byte, unabhängig von der Struktur der Liste (unter 64Bit Systemen vermutlich 16 Byte)
Also 2*Integer

Hier ein Beispielcode für eine mögliche Nutzung von Bäumen mittels Listen:

Code: Alles auswählen

;##################################################################################################################

Structure Tree
  Text$
  List *Child.Tree()   ; Liste der Pointer der Unterelemente 
EndStructure

Procedure CreateChild(*Tree.Tree, Text$="")
  AddElement(*Tree\Child())                     ; Hinzufügen eines neuen Elements in der Liste
  *Tree\Child() = AllocateMemory(SizeOf(Tree))  ; Reservierung des Speichers für einen komplett neuen Baum
  InitializeStructure(*Tree\Child(), Tree)      ; Initialisierung der Struktur mit Liste im neu angelegten Speicher
  *Tree\Child()\Text$ = Text$
  ProcedureReturn *Tree\Child()
EndProcedure

Procedure DebugTree(*Tree.Tree, Level=0)
  Debug Space(Level)+*Tree\Text$
  ResetList(*Tree\Child())
  While NextElement(*Tree\Child())
    DebugTree(*Tree\Child(), Level+3)
  Wend
EndProcedure

Tree.Tree
Tree\Text$ = "Root"
CreateChild(Tree, "Child 1")
CreateChild(Tree, "Child 2")
CreateChild(Tree\Child(), "SubChild 2.1")
CreateChild(Tree\Child(), "SubChild 2.2")
CreateChild(Tree\Child(), "SubChild 2.3")
CreateChild(Tree\Child()\Child(), "SubSubChild 2.3.1")
CreateChild(Tree\Child()\Child(), "SubSubChild 2.3.2")
CreateChild(Tree\Child(), "SubChild 2.4")
*Child = CreateChild(Tree, "Child 3")
CreateChild(*Child, "SubChild 3.1")
CreateChild(*Child, "SubChild 3.2")


DebugTree(Tree)

Re: Beispiele zu neuen Funktionen in PB 4.50

Verfasst: 01.04.2010 15:26
von ts-soft
erster Codeteil stürzt grundsätzlich ab, x86 und x64 auf sieben.

der zweite läuft einwandfrei :allright: , aber wie gibt man denn diesen Speicher wieder frei?

Gruß
Thomas

Re: Beispiele zu neuen Funktionen in PB 4.50

Verfasst: 01.04.2010 15:43
von STARGÅTE
hat man "normale" Listen in Strukturen ...
würde ein DeleteElement alle Unterlisten mit String usw. selber wegmachen:

Code: Alles auswählen

Structure Test
  List String.s()
EndStructure

NewList Test.Test()

For n = 1 To 1000
  AddElement(Test())
  For i = 1 To 1000
    AddElement(Test()\String())
    Test()\String() = Space(1000)
  Next
Next

ClearList(Test())
ClearList(Test()) löscht also erst die unterlisten und gibt deren Strings frei ... und dann erst sich selber.


In meinem Beispiel muss ich ja selber den Speicher erstellen um eine neue KinderListe zu erzeugen.

Beim löschen des Baums, muss man dann erst von den SubElementen die Speicher wieder freigeben.
Also sowohl ClearStructure() als auch FreeMemory()
Danach häte das Elternelement dieser Kinder eine Liste "voller ungültiger Pointer"
Dort kann man dann wieder ClearStructure() anwenden, usw.

Ein DeleteElement würde also hier nur das eigene Elemnt löschen und deren Pointerliste.
Wäre da aber auch Listen würden die da bleiben ....

Re: Beispiele zu neuen Funktionen in PB 4.50

Verfasst: 23.04.2010 12:02
von milan1612
STARGÅTE hat geschrieben:Es ist zwar nach wie vor verboten Rekursive Strukturen zu bauen:

Code: Alles auswählen

Structure Tree
  List SubTree.Tree()
EndStructure
Fred hat grade im englischen Forum versprochen dass diese Einschraenkung aufgehoben wird :allright:

Re: Beispiele zu neuen Funktionen in PB 4.50

Verfasst: 23.04.2010 12:17
von NicTheQuick
Und damit niemand suchen muss: List/Map in Structure - recursion error

Re: Beispiele zu neuen Funktionen in PB 4.50

Verfasst: 23.04.2010 14:00
von STARGÅTE
wow, das wäre natürlich super ...

Dann könnte man zum aller ersten mal echte Tree-Lists erstellen, ohne eigene Speicher zu reservierern oder umwege zu machen.

Zwar arbeitet meine aktuelle TreeList auch komplett ohne Listen, aber toll wäre es trotzdem

Re: Beispiele zu neuen Funktionen in PB 4.50

Verfasst: 23.04.2010 14:45
von milan1612
STARGÅTE hat geschrieben:Zwar arbeitet meine aktuelle TreeList auch komplett ohne Listen, aber toll wäre es trotzdem
Ich finde je weniger man manuell im Speicher rumdoktoren muss umso besser und sicherer.
Das ist auf jeden Fall ein wichtiges Feature (das wichtigste fuer mich seit langem!) :allright:

Re: Beispiele zu neuen Funktionen in PB 4.50

Verfasst: 25.10.2012 16:52
von STARGÅTE
Ist nicht die feine Art in einem Zitat einfach die URL zu ändern.
Könnte ein Mod das mal korrigieren!

Edit: Der betreffende Beitrag wurde bereits gelöscht.

Re: Beispiele zu neuen Funktionen in PB 4.50

Verfasst: 25.10.2012 16:56
von ts-soft
@STARGÅTE
Hab den Beitrag mal per Bild gemeldet.

Re: Beispiele zu neuen Funktionen in PB 4.50

Verfasst: 25.10.2012 16:58
von RSBasic
Hab zwar den zitierten Link angepasst, aber der User wird eh bald gelöscht, weil der User laut stopforumspam.com ein Bot/Spam ist.