我正在使用多路树的有界版本。我可以创建我的元素类型并实例化我的类型的树,但是如何创建根?我看到了几种形式的 Insert_Child。我使用 Insert_Child 的所有尝试都失败了,因为我使用 No_Element 作为 Parent 或 Before 参数。
有没有人有使用多路树包的例子,他们可以指出我?
如果重要的话,我正在使用免费的 Gnat 版本的 Ada。
我正在使用多路树的有界版本。我可以创建我的元素类型并实例化我的类型的树,但是如何创建根?我看到了几种形式的 Insert_Child。我使用 Insert_Child 的所有尝试都失败了,因为我使用 No_Element 作为 Parent 或 Before 参数。
有没有人有使用多路树包的例子,他们可以指出我?
如果重要的话,我正在使用免费的 Gnat 版本的 Ada。
创建一个类型的变量Tree
;ARM中有提示,
有一个特殊的节点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/ 鲍勃
有趣的是,当我尝试示例代码时,我在树迭代器循环中得到了 STORAGE_ERROR。
我在 Linux 的 Windows 子系统下运行 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