Ada 2012多路树,创建根节点

Ada 2012多路树,创建根节点,ada,gnat,multiway-tree,Ada,Gnat,Multiway Tree,我正在使用多路树的有界版本。我可以创建我的元素类型并实例化我类型的树,但是如何创建根呢?我看到几种形式的插入式儿童。我所有使用Insert\u Child的尝试都失败了,因为我没有为父参数或Before参数使用任何\u元素 有人能给我举一个使用多路树包的例子吗 如果有必要的话,我正在使用Ada的免费Gnat版本。创建一个Tree类型的变量;手臂上有一个 有一个特殊的节点,根节点,它始终存在并具有 既不是关联的元素值,也不是任何父节点。根节点 提供将节点添加到其他空树的位置,并 表示树的底部 差不

我正在使用多路树的有界版本。我可以创建我的元素类型并实例化我类型的树,但是如何创建根呢?我看到几种形式的插入式儿童。我所有使用Insert\u Child的尝试都失败了,因为我没有为父参数或Before参数使用任何\u元素

有人能给我举一个使用多路树包的例子吗


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

创建一个
Tree
类型的变量;手臂上有一个

有一个特殊的节点,根节点,它始终存在并具有 既不是关联的元素值,也不是任何父节点。根节点 提供将节点添加到其他空树的位置,并 表示树的底部

差不多

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

创建
树类型的变量
;手臂上有一个

有一个特殊的节点,根节点,它始终存在并具有 既不是关联的元素值,也不是任何父节点。根节点 提供将节点添加到其他空树的位置,并 表示树的底部

差不多

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

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

我想我可以让我创建的第一个节点成为集合总数的占位符,然后让真正的树分支离开它。看起来笨拙但可行


/s/Bob

有趣的是,当我尝试示例代码时,我在树迭代器循环中得到了一个存储错误

我在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

有趣的是,当我尝试示例代码时,我在树迭代器循环中得到了一个存储错误

我在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

是的,根函数是您的朋友
函数根(容器:Tree)返回游标是,根函数是您的朋友
函数根(容器:树)返回光标