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

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

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

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

2 ответа

Создайте переменную типа Tree; есть подсказка в ARM,

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

Что-то вроде

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

Интересно, что когда я пробую пример кода, я получаю 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

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

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

/ s / Bob

Другие вопросы по тегам