我想打印访问变量(指针)的地址以进行调试。
type Node is private;
type Node_Ptr is access Node;
procedure foo(n: in out Node_Ptr) is
package Address_Node is new System.Address_To_Access_Conversions(Node);
use Address_Node;
begin
Put_Line("node at address " & System.Address_Image(To_Address(n)));
end foo;
Address_Image 返回地址的字符串表示形式。
System.Address_To_Access_Conversions 是一个通用包,用于在地址和访问类型之间进行转换(参见ARM 13.7.2),定义如下:
generic
type Object(<>) is limited private;
package System.Address_To_Access_Conversions is
-- [...]
type Object_Pointer is access all Object;
-- [...]
function To_Address(Value : Object_Pointer) return Address;
-- [...]
end System.Address_To_Access_Conversions;
gnat 给我上面定义的过程 foo 的以下错误:
来自实例的预期类型“System.Address_To_Access_Conversions.Object_Pointer”... 发现类型“Node_Ptr”定义在...
Object_Pointer 定义为访问所有对象。据我了解,Object 类型是 Node,因此 Object_Ptr 可以访问所有 Node。蚊子在抱怨什么?
我想我对 Ada 泛型的理解是有缺陷的,我没有正确使用 System.Address_To_Access_Conversions。
编辑:我用“gnatmake -gnatG”编译了我的代码以查看通用实例化:
package address_node is
subtype btree__clear__address_node__object__2 is btree__node;
type btree__clear__address_node__object_pointer__2 is access
all btree__clear__address_node__object__2;
function to_address (value :
btree__clear__address_node__object_pointer__2) return
system__address;
end address_node;
btree__node 是上面定义的类型 Node 的重命名,所以我真的认为 to_address() 的参数类型是正确的,但是 gnat 抱怨(见上文)。