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

如何打印ada访问变量指向的地址?,ada,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 " &

出于调试目的,我想打印访问变量(指针)的地址

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;
地址\图像返回地址的字符串表示形式。
System.Address_To_Access_Conversions是一个通用包,用于在地址和访问类型之间进行转换(请参阅),定义如下:

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;

btree_uuunode是上面定义的类型节点的损坏名称,因此我确实认为to_address()的参数类型是正确的,但是gnat在抱怨(参见上文)。

好的,显式类型转换实现了以下目的:

procedure Foo(n: in out Node_Ptr) is
    package Address_Node is new System.Address_To_Access_Conversions(Node);
    use Address_Node;
    p : Address_Node.Object_Pointer;
begin
    p := Address_Node.Object_Pointer(n);
    Put_Line("node at address " & System.Address_Image(To_Address(p)));
end Foo;

需要一些时间来适应Ada…;-)

目前我面前没有编译器,但这不管用吗

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

是的。我没有发现任何关于访问变量显式解引用的内容,所以我假设Ada中没有这样的内容。我现在更清楚了,谢谢!您还可以执行
'access
来获取指针,这是一个更有用的微点。你真的不应该在Ada做这两件事,除非在一些非常罕见的情况下。我建议你去你的友好邻居Ada LRM的附录K(语言定义属性),仔细阅读。里面有很多好东西。
procedure Foo(n: in out Node_Ptr) is
    package Address_Node is new System.Address_To_Access_Conversions(Node);
    use Address_Node;
    p : Address_Node.Object_Pointer;
begin
    p := Address_Node.Object_Pointer(n);
    Put_Line("node at address " & System.Address_Image(To_Address(p)));
end Foo;
procedure foo(n: in out Node_Ptr) is 
begin 
   Put_Line("node at address " & System.Address_Image(n.all'address)); --'
end foo;