2017-01-06 2 views
0

je suis en train d'imprimer actuellement (« Ada.Text_IO.Put ») un type générique, mais cela ne fonctionne pas toujours avec des erreurs comme ça:Comment imprimer un type générique dans ada?

missing argument for parameter "Item" in call to "Put" declared at a-tiinio.ads:60, instance at a-inteio.ads:18 
expected type "Standard.Integer" 
found private type "My_Type" defined at testtype.ads:2 

Ces erreurs de sens, mais je ne sais pas comment imprimer mes valeurs . Les lignes suivantes montrent mon type générique.

generic 
    type My_Type is private; 
    with function "+"(Left: My_Type; Right: My_Type) return My_Type; 

package TestType is 
    ... 
end TestType; 

Merci pour toute aide!

Répondre

6

Vous pouvez exiger un autre paramètre générique tel que:

with function image(Item : in My_Type) return String; 

Ensuite, il suffit d'imprimer la sortie de chaîne par la fonction de l'image.

Un exemple d'un paramètre réel pourrait être:

image => Integer'Image 
2

Le point d'un être générique qui « il » fonctionne avec tout type, et celui de Text_IO étant que cela fonctionne avec les types connus lors de l'appel de ses sous-programmes , c'est-à-dire les chaînes, vous avez besoin d'autre chose de générique pour imprimer n'importe quel type. Donc, soit passer une fonction spéciale qui transforme de votre type à String, comme répondu par Jim Rogers. Ou, passez un paquet formel générique avec My_Type, pour l'impression. Par exemple.

generic 
    type Any_Type is private; 
package Any_Type_IO is 
    procedure Put (Item : Any_Type); 
    procedure Get (Item : out Any_Type); 
end Any_Type_IO; 

with Any_Type_IO; 
generic 
    type My_Type is private; 
    with function "+"(Left: My_Type; Right: My_Type) return My_Type; 
    with package Printer is new Any_Type_Io (Any_Type => My_Type); 
package TestType is 
    procedure Run_Test; 
end TestType; 

Ainsi, avec un type de devenir un type réel générique de TestType, il y aura un paquet pour devenir un véritable paquet générique de TestType. Ils correspondent. Dans une instance de TestType, vous pouvez ensuite les utiliser ensemble.

type T is range 1 .. 10; 
package T_IO is new Any_Type_IO (T); 

package My_Test_Instance is new TestType 
    (My_Type => T, 
    "+"  => "+", 
    Printer => T_IO); 

Si vous fournissez un paquet d'impression tels que Any_Type_IO, l'impression devient générique dans les deux sens: il est le travail d'un paquet d'impression correspondant, et il doit aussi correspondre à un paquet formel générique dans le sens Ada.