簡體   English   中英

如何打印ada訪問變量指向的地址?

[英]How to print the address an ada access variable points to?

我想打印訪問變量(指針)的地址以進行調試。

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給出了以下錯誤:

expected type "System.Address_To_Access_Conversions.Object_Pointer" from instance at line...
found type "Node_Ptr" defined at ...

Object_Pointer被定義為訪問所有Object。 根據我的理解,Object類型是Node,因此Object_Ptr訪問所有Node。 什么是gnat抱怨?
我想我對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; 

好的,顯式類型轉換可以解決問題:

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;

需要一段時間習慣阿達... ;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM