0

我正在使用多路树的有界版本。我可以创建我的元素类型并实例化我的类型的树,但是如何创建根?我看到了几种形式的 Insert_Child。我使用 Insert_Child 的所有尝试都失败了,因为我使用 No_Element 作为 Parent 或 Before 参数。

有没有人有使用多路树包的例子,他们可以指出我?

如果重要的话,我正在使用免费的 Gnat 版本的 Ada。

4

3 回答 3

3

创建一个类型的变量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
于 2013-07-14T21:37:54.090 回答
0

感谢您的回答,但您对没有元素的根的描述可能会导致我改变我的设计。我期望构建一个由子组件等组成的组件树。我想将每个元素的属性(例如质量或价格)汇总到组件的总数中,并将其存储在根目录中。

我想我可以让我创建的第一个节点作为程序集总数的占位符,然后从中获得真正的树分支。看似笨拙但可行。

/s/ 鲍勃

于 2013-07-17T02:45:58.850 回答
0

有趣的是,当我尝试示例代码时,我在树迭代器循环中得到了 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
于 2020-02-08T00:34:24.930 回答