Ада 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