Ada 2012 Multiway Tree, создание корневого узла

Я использую ограниченную версию Multiway Tree. Я могу создать свой тип элемента и создать экземпляр дерева моего типа, но как мне создать корень? Я вижу несколько форм Insert_Child. Все мои попытки использовать Insert_Child терпят неудачу, потому что я использую No_Element для аргумента Parent или Before.

У кого-нибудь есть пример использования пакета multiway tree, на который они могут мне указать?

Я использую бесплатную версию Ады Gnat, если это имеет значение.


person user1625344    schedule 14.07.2013    source источник


Ответы (3)


Создайте переменную типа Tree; в РУКА,

Существует специальный узел root, который присутствует всегда и не имеет ни связанного значения элемента, ни родительского узла. Корневой узел обеспечивает место для добавления узлов к пустому дереву и представляет собой основу дерева.

Что-то вроде

with Ada.Containers.Multiway_Trees;
with Ada.Text_IO; use Ada.Text_IO;
procedure Mway is
   package Trees is new Ada.Containers.Multiway_Trees (Integer);
   T : Trees.Tree;
   C : Trees.Cursor;
begin
   C := T.Root;
   T.Append_Child (Parent => C, New_Item => 1);
   T.Append_Child (Parent => C, New_Item => 2);
   for E of T loop
      Put_Line (E'Img);
   end loop;
end Mway;

выход которого

1
2
person Simon Wright    schedule 14.07.2013
comment
Да, корневая функция — ваш друг function Root (Container : Tree) return Cursor; - person egilhh; 15.07.2013

Спасибо за ответ, но ваше описание корня без элемента может заставить меня изменить свой дизайн. Я предполагал построить дерево компонентов, состоящее из подкомпонентов и так далее. Я хотел свести свойство, скажем, массу или цену, каждого элемента в общую сумму сборки и сохранить ее в корне.

Я думаю, что я могу сделать первый узел, который я создаю, заполнителем для общей суммы сборки, а затем отделить от него настоящую ветвь дерева. Выглядит неуклюже, но работоспособно.

/ с / Боб

person user1625344    schedule 17.07.2013

Интересно, что когда я пробую пример кода, я получаю STORAGE_ERROR в цикле итератора дерева.

Я запускаю Debian в подсистеме Windows для Linux. WSL1 не позволяет регулировать размер стека через ulimit.

Исправление, по-видимому, заключается в том, чтобы включить оптимизацию компилятора:

ebolar@Beowulf:~/Build/Ada/src$ gnatmake -s -g simpletree
gcc-6 -c -g simpletree.adb
simpletree.adb:3:11: warning: file name does not match unit name, should be "mway.adb"
gnatbind-6 -x simpletree.ali
gnatlink-6 simpletree.ali -g
ebolar@Beowulf:~/Build/Ada/src$ ./simpletree
Load up the tree
Check out the contents

raised STORAGE_ERROR : stack overflow or erroneous memory access


ebolar@Beowulf:~/Build/Ada/src$ gnatmake -s -g -O simpletree
gcc-6 -c -g -O simpletree.adb
simpletree.adb:3:11: warning: file name does not match unit name, should be "mway.adb"
gnatbind-6 -x simpletree.ali
gnatlink-6 simpletree.ali -g -O
ebolar@Beowulf:~/Build/Ada/src$ ./simpletree
Load up the tree
Check out the contents
 1
 2
person EBolar    schedule 08.02.2020