[Solved]variablen in einer Baumstrucktur speichern

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Littellittel
Beiträge: 20
Registriert: Mi 22. Apr 2015, 16:25

[Solved]variablen in einer Baumstrucktur speichern

Beitrag von Littellittel »

Hallo Liebe Com­mu­ni­ty,

in meinem derzeitigem Projekt (einen Schachcomputer from scratch), habe Ich ein Problem mit dem Speichern meines Varianten-Baums, Ich kann alle möglichen Stellungen aus einer Stellung erzeugen und in ein Array of pposition speichern.

Code: Alles auswählen

 
  Tposition = array[0..7] of array[0..7] of integer;
  pposition = Tposition;
 


allerdings weiß Ich nicht wie diese Stellungen nun speichern und den vorherigen Stellungen zuordnen kann. Meine Idee für so etwas war ein Zahlencode im index des Arrays

Code: Alles auswählen

 
var
 tree := array of pposition;
begin
 tree[011] := position; //Stellung 1 von Stellung 1 von Stellung 0 soll gespeichert werden
 tree[011] := position; //Stellung 11 von Stellung 0 soll gespeichert werden
//diese beiden Positionen würden sich also überschreiben. Deswegen habe Ich auf ein Array mit variabler Dimensionsanzahl gehofft. Ungefähr so:
 setdimensions(tree,depth); //depth ist die Suchtiefe (also beim ersten zug 1 beim 2ten 2 usw.)
 tree[0,1,1] := position; //Stellung 1 von Stellung 1 von Stellung 0 soll gespeichert werden
 tree[0,11] := position; //Stellung 11 von Stellung 0 soll gespeichert werden
//diese Methode würde für 2 verschiedene Speicherorte sorgen.
end;
 


Leider geht dies wahrscheinlich nicht (zumindest habe ich nur Quellen gefunden die es für unmöglich erklärt haben).
Also brauch Ich eine andere Art des Speicherns.

Zurzeit benutze Ich einen Workaround der aber extrem inefficient ist.

Kennt irgendjemand eine Möglichkeit so einen Baum zu speichern?

Danke im Vorraus.
Zuletzt geändert von Littellittel am Fr 8. Jul 2016, 12:39, insgesamt 1-mal geändert.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: variablen in einer Baumstrucktur speichern

Beitrag von Michl »

Was mir spontan einfallen würde, wäre eine TList zu nehmen und immer Parent, FirstChild, NextSilbling als Pointer zu definieren und zu verlinken.

Gänge auch ohne TList. Z.B.:

Code: Alles auswählen

  TPosition = array[0..7] of array[0..7] of integer;
  PTreePosition = ^TTreePosition;
  TTreePosition = record
    Position: TPosition;
    Parent: PTreePosition;
    Next: PTreePosition;
    Child: PTreePosition;
  end;
Nun das Ganze in eine Klasse packen und bei MyClass.AddNext oder MyClass.AddChild mit New() und bei MyClass.Delete mit Dispose() jeweils TreePositions erzeugen und wieder frei geben.

Eine andere Möglichkeit wäre, schon so eine fertige Struktur zu nehmen, z.B. die von einen TTreeView oder TVirtualStringTree. Beide haben etwas Overhead, sind aber fertig und bringen möglicherweise sinnvolle Methoden mit.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Littellittel
Beiträge: 20
Registriert: Mi 22. Apr 2015, 16:25

Re: variablen in einer Baumstrucktur speichern

Beitrag von Littellittel »

ah,

Danke Michl Ich habe das jetzt so ähnlich umgesetzt und es funktioniert!

Antworten