Я хочу напечатать адрес переменной доступа (указатель) для целей отладки.
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. На что жалуется комат?
Я полагаю, что мое понимание обобщения Ada неверно, и я неправильно использую System.Address_To_Access_Conversions.
EDIT:
Я скомпилировал свой код с помощью "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 жалуется (см. Выше).