2017-08-05 37 views
0

将访问转换为常量以访问 变量的正确方法是什么? (是的,我知道那么我需要小心不要修改这个 “变量”。)Ada:将访问转换为常量以访问变量

也许Unchecked_Conversion

但是:

  1. Unchecked_Conversion的标准保证在这种情况下, 很好地工作?

  2. 有没有比Unchecked_Conversion更简单的方法?

回答

3

Unchecked_Conversion不能保证在这种情况下工作,如阿达不给你访问类型的内存布局任何保证。据推测,Ada有意允许编译器为每种访问类型设置独特的内存布局和含义。

如果您将Convention => C方面添加到您的访问类型中,您可能会得到所需的公用内存布局,因为C认为所有指针都在相同的地址空间上运行。

2

好吧,发生了什么事情[有可能]在参数模式(可能是类型定义)的某处存在不匹配。

比方说,有几个类型:

Type Window(<>) is tagged private; 
Type Constant_Reference is not null constant access Window'Class; 
Type Reference is not null access Window'Class; 
Type Handle is access Window'Class; 

鉴于Function Get_Handle (Object : in out aliased Window'Class)我们能说的Object'Access?那么这是对Window'Class的访问,它不是常量 - 所以它与HandleReference兼容,但不兼容Constant_Reference

另一方面,如果我们有Function Get_Handle (Object : aliased Window'Class)那么Object'Access将产生一个匿名访问,由于参数中的恒定性质,它会与Constant_Reference兼容。

因此,检查你的参数和你的设计,看看是否是什么导致你的问题。