5

デバッグ用にアクセス変数 (ポインター) のアドレスを出力したいと考えています。

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() のパラメーター型は正しいと思いますが、ブヨは文句を言っています (上記を参照)。

4

2 に答える 2

5

現在、目の前にコンパイラはありませんが、これは機能しませんか?

procedure foo(n: in out Node_Ptr) is 
begin 
   Put_Line("node at address " & System.Address_Image(n.all'address)); --'
end foo; 
于 2010-05-06T20:37:05.377 に答える
1

わかりました、明示的な型変換はトリックを行います:

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 に慣れるには時間がかかります... ;-)

于 2010-05-06T18:36:40.663 に答える