Ada 2012多路树,创建根节点

问题描述 投票:0回答:3

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

有人能使用指向我的多路树包的例子吗?

如果有问题,我正在使用免费的Gnat版本的Ada。

ada gnat multiway-tree
3个回答
3
投票

创建类型为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

0
投票

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

我想我可以让我创建的第一个节点成为装配体总数的占位符,然后从中得到真正的树枝。似乎笨拙但可行。

/ s / Bob


0
投票

有趣的是,当我尝试示例代码时,在树迭代器循环中收到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
© www.soinside.com 2019 - 2024. All rights reserved.