Ten sam typ rekordu w rekordzie

0

Witam.
Chciałem uzyskać taki efekt gdzie typ rekordu jest dostępny także w tym rekordzie.

type
 RNode = record
   Data:String;
   Node:array of RNode;
 end;

Tylko że kompilator wywala że RNode nie został zadeklarowany i nie wiem jak to ugryźć z w słowa żeby nawet googlować;

3

jedynie możesz tak zrobić na wskaźnikach

type
 RNode = record
   Data:String;
   Node:array of PNode;
 end;
 PNode = ^RNode;
0

A więc z pointerem przechodzi fajnie wiedzieć dzięki.

1

Można też na odwrót:

type
  PNode = ^TNode;
  TNode = record
    Data: String;
    Node: array of PNode;
  end;

Jest to dopuszczalne w tym przypadku; Przy klasach jest jeszcze ciekawiej, bo w ogóle bez klauzul i wskaźników:

type
  TNode = class(TObject)
  private
    FNodes: array of TNode;
  end;

BTW: Pole Node raczej powinno się nazywać Nodes, bo masz ich listę, czyli liczbę mnogą (taka wskazówka).

0

Jeżeli pole Node zawiera przez większą część czasu stałą liczbę elementów, wystarczy:

Type PNode = ^TNode;
     TNode =
     Record
      Data    : String;
      Children: PNode;
     End;

Odwoływanie się: Node.Children[indeks]
Alokacja: Node.Children := AllocMem(sizeof(TNode) * liczba elementów);
Będzie nieco szybsze w działaniu.

0

Nie przewiduje by ten "kontroler danych " był trzymany długo w pamięci ani był jakoś specjalnie dużo wykorzystywany poza tym że załaduj dane > pobierz z niego ważne informacje > zwolnij pamięć. aczkolwiek jak skończę go pisać to sprawdzę czy da mi to znaczącą różnicę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1