Types Ada';实现中的私有类型可见性

Types Ada';实现中的私有类型可见性,types,visibility,private,ada,gnat,Types,Visibility,Private,Ada,Gnat,私有类型在单元实现中是否可见?例如,.ads: package Unlimited_Strings is type String_Block is private; (...) private Max_Block_Size : constant Integer := 10; subtype String_Size_Subtype is Integer range 0..Max_Block_Size; type String_Block(Size : String_Size

私有类型在单元实现中是否可见?例如,.ads:

package Unlimited_Strings is
   type String_Block is private;
(...)
private
   Max_Block_Size : constant Integer := 10;
   subtype String_Size_Subtype is Integer range 0..Max_Block_Size;
   type String_Block(Size : String_Size_Subtype := Max_Block_Size) is record
      Next : Unlimited_String := null;        
      Str : String(1..Size) := (others => ' ');
   end record;
亚洲开发银行:

Aux_Ptr := new String_Block(Max_Block_Size);

产生一个编译错误:“当类型具有受约束的局部视图时,不允许约束”。

正如Simon所说,我们这里需要一个复制器。我怀疑“.adb”文件实际上不是与您正在显示的.ads对应的文件

请注意,由于您使用的是判别式的默认值,因此实际上并没有创建无约束类型。这意味着编译器将始终为
字符串块
(对应于
最大块
)分配最大大小,即使您为
大小
指定了更小的值。这可能不是您想要的(这是一个棘手的领域)

另一方面,由于
String\u Block
的公共声明指定该类型受约束,因此您当然必须指定默认值。也许你的意思是:

   type String_Block (<>) is private;
private
   type String_Block (Size : String_Size_Subtype) is record ...
type String_Block()是私有的;
私有的
类型字符串\u块(大小:字符串\u大小\u子类型)是记录。。。

再次声明:就我们所知,您的代码是有效的,以上只是一个关于更好的内存使用的建议。

正如Simon所说,我们这里需要一个复制器。我怀疑“.adb”文件实际上不是与您正在显示的.ads对应的文件

请注意,由于您使用的是判别式的默认值,因此实际上并没有创建无约束类型。这意味着编译器将始终为
字符串块
(对应于
最大块
)分配最大大小,即使您为
大小
指定了更小的值。这可能不是您想要的(这是一个棘手的领域)

另一方面,由于
String\u Block
的公共声明指定该类型受约束,因此您当然必须指定默认值。也许你的意思是:

   type String_Block (<>) is private;
private
   type String_Block (Size : String_Size_Subtype) is record ...
type String_Block()是私有的;
私有的
类型字符串\u块(大小:字符串\u大小\u子类型)是记录。。。

再次声明:就我们所知,您的代码是有效的,以上只是一个建议,说明什么可以更好地使用内存。

我们需要一个-尤其要注意“完整”!因为我试图重现你的问题,所以编译得非常完美。@SimonWright,你是在Windows还是Linux下编译的?我认为这个示例可以在Windows中编译,但不能在Linux中编译。我在Linux上使用gnat 4.6。您的示例根本无法编译,因为它不完整。(而且,作为信息,我是在OSX上的)。我们需要一个-特别是注意“完整”!因为我试图重现你的问题,所以编译得非常完美。@SimonWright,你是在Windows还是Linux下编译的?我认为这个示例可以在Windows中编译,但不能在Linux中编译。我在Linux上使用gnat 4.6。您的示例根本无法编译,因为它不完整。(而且,我在OSX上)manuBriot,.ads和.adb实际上来自同一个部门。我认为判别式的默认值是有效的,因为如果我不使用任何值,它将获得默认值,如果我指示一个较小的值,它将被分配一个较小的大小。如果我按您的指示使用
()
,错误就会消失。不,这是我的观点。如果为判别式指定较小的值,编译器仍会分配最大大小!我完成了问题中记录的定义。我确定分配大小的方法是使用
Str'Last
。如果使用参数5,则最后一个索引是5,而不是10。您的意思是编译器分配了10个字符,但将最后一个索引设置为5?为5分配大小(您永远不能使用索引6),但在记录末尾添加一些填充,使其大小与指定的10相同。manuBriot、.ads和.adb实际上来自同一个单位。我认为判别式的默认值是有效的,因为如果我不使用任何值,它将获得默认值,如果我指示一个较小的值,它将被分配一个较小的大小。如果我按您的指示使用
()
,错误就会消失。不,这是我的观点。如果为判别式指定较小的值,编译器仍会分配最大大小!我完成了问题中记录的定义。我确定分配大小的方法是使用
Str'Last
。如果使用参数5,则最后一个索引是5,而不是10。您的意思是编译器分配了10个字符,但将最后一个索引设置为5?为5分配大小(您永远不能使用索引6),但在记录末尾添加一些填充,使其大小与指定的10相同。