我正在使用Multiway Tree的有界版本。我可以创建元素类型并实例化该类型的树,但是如何创建根?我看到几种形式的Insert_Child。我所有使用Insert_Child的尝试均失败,因为我将No_Element用作Parent或Before参数。
有人能使用指向我的多路树包的例子吗?
如果有问题,我正在使用免费的Gnat版本的Ada。
创建类型为Tree
的变量; ARM中有一个hint,
有一个特殊节点,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
谢谢您的回答,但是您对根没有元素的描述可能会导致我更改设计。我期望构建一棵由子组件等组成的组件树。我想将每个元素的属性(例如质量或价格)汇总到装配的总数中,并将其存储在根目录中。
我想我可以让我创建的第一个节点成为装配体总数的占位符,然后从中得到真正的树枝。似乎笨拙但可行。
/ s / Bob
有趣的是,当我尝试示例代码时,在树迭代器循环中收到STORAGE_ERROR。
我正在Windows Linux子系统下运行Debian。 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