Je souhaite imprimer l'adresse d'une variable d'accès (pointeur) à des fins de débogage.Comment imprimer l'adresse d'une variable d'accès 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;
Adresse_Image renvoie la représentation sous forme de chaîne d'une adresse.
System.Address_To_Access_Conversions est un paquet générique pour convertir entre les adresses et les types d'accès (voir ARM 13.7.2), défini comme suit:
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;
moucheron me donne les erreurs suivantes pour la procédure foo définies ci-dessus:
expected type "System.Address_To_Access_Conversions.Object_Pointer" from instance at line... found type "Node_Ptr" defined at ...
Object_Pointer est défini en tant qu'accès à tous les objets. D'après ce que j'ai compris, le type Object est Node, donc Object_Ptr accède à tous les nœuds. De quoi se plaint le gnat?
Je suppose que ma compréhension des génériques Ada est erronée et que je n'utilise pas correctement System.Address_To_Access_Conversions.
EDIT: Je compilé mon code avec « gnatmake -gnatG » pour voir le instanciation générique:
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 est le nom mutilée du nœud de type tel que défini ci-dessus, donc je pense vraiment que le type de paramètre car to_address() est correct, mais gnat se plaint (voir ci-dessus).
Oui, cela fonctionne. –
Oui, c'est le cas. Je n'ai rien trouvé sur le déréférencement explicite des variables d'accès, donc j'ai supposé qu'il n'y en a pas dans Ada. Je sais mieux maintenant, merci! – georg
Vous pouvez aussi faire un '' accès '' pour obtenir un pointeur, ce qui est un peu plus utile. Vous ne devriez vraiment pas faire ça non plus dans Ada, sauf dans des circonstances très rares. Je vous suggère d'aller à l'annexe K (Attributs définis par la langue) de votre voisinage amical Ada LRM et de lire à travers elle. Il y a beaucoup de bonnes choses là-dedans. –