如何打印ada访问变量指向的地址?

geo*_*org 4 ada

我想打印访问变量(指针)的地址以进行调试。

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

对于上面定义的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;
Run Code Online (Sandbox Code Playgroud)

btree__node是上面定义的Node类型的错误名称,所以我真的认为to_address()的参数类型正确,但是gnat抱怨(参见上文)。

T.E*_*.D. 5

我目前没有编译器,但是这行不通吗?

procedure foo(n: in out Node_Ptr) is 
begin 
   Put_Line("node at address " & System.Address_Image(n.all'address)); --'
end foo; 
Run Code Online (Sandbox Code Playgroud)

  • 您也可以执行`'access`获取指针,这是一个有用的小技巧。除了在极少数情况下,您实际上不应该在Ada中进行任何操作。我建议您转到您的友好邻域Ada LRM的附录K(语言定义的属性),并仔细阅读它。那里有很多好东西。 (4认同)