我想打印访问变量(指针)的地址以进行调试。
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;
对于上面定义的foo过程,gnat给了我以下错误:
行中实例的预期类型为“ System.Address_To_Access_Conversions.Object_Pointer”。 发现类型“ Node_Ptr”定义在...
定义Object_Pointer为访问所有对象。根据我的理解,对象类型是节点,因此Object_Ptr是访问所有节点。抱怨什么?
我想我对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抱怨(参见上文)。
我目前没有编译器,但是这行不通吗?
procedure foo(n: in out Node_Ptr) is 
begin 
   Put_Line("node at address " & System.Address_Image(n.all'address)); --'
end foo;