Sujet : Re: Question de généricité
De : 314 (at) *nospam* drpi.fr (DrPi)
Groupes : fr.comp.lang.adaDate : 30. Aug 2023, 21:13:57
Autres entêtes
Organisation : Posted through news.alphanet.ch
Message-ID : <uco7u8$156$1@shakotay.alphanet.ch>
References : 1 2
User-Agent : Mozilla Thunderbird
-- subtype t_TW_STR32 is char_array (1 .. 34);
-- subtype t_TW_STR64 is char_array (1 .. 66);
-- subtype t_TW_STR128 is char_array (1 .. 130);
-- subtype t_TW_STR255 is char_array (1 .. 256);
generic
type Item_Type is private;
nul : Item_Type;
type Index_Type is mod <>;
type Array_Type is array (Index_Type range <>) of Item_Type;
with function To_Item_Type (c : Character) return Item_Type;
function To_TW_STR (Item : String) return Array_Type;
function To_TW_STR (Item : String) return Array_Type is
begin
return Result : Array_Type (1 .. Item'Length + 1) with Relaxed_Initialization do
for J in Item'Range loop
Result (Index_Type (J - Item'First + 1)) := To_Item_Type (Item (J)); -- Was J - Item'First
end loop;
Result (Index_Type (Item'Length + 1)) := nul; -- Was Item'Last + 1
end return;
end To_TW_STR;
function To_TW_C is new To_TW_STR (char, nul, size_t, char_array, to_C);
begin
null;
end;
Je ne comprends pas "nul : Item_Type" dans les paramètres génériques. A quoi sert cette ligne ?
Je ne comprends pas non plus pourquoi on passe "Item_Type" et "Index_Type" sachant que "Array_Type" définit complètement le type ("char_array" ici).
Dans mon cas, je veux passer un type entièrement contraint en générique. La taille du tableau de sortie doit être égale au type entièrement contraint passé en générique, pas au paramètre "Item" de la fonction.
Comment faire ?
Sinon, il faudrait avoir accès à l'élément assigné (LHS) à partir de la fonction.
En VHDL-2019 (langage très fortement inspiré de Ada), une fonction peut s'écrire :
function my_func (param1 : in t_type1; param2 : in t_type2) return param_ret of t_type_ret;
Par exemple avec "var := my_func (var1, var2);"
la fonction "my_func" a accès à "var" à travers l'identifiant "param_ret". Dans "my_func", il est possible d'utiliser "param_ret'Length" ou "param_ret'Range" par exemple.
Je ne crois pas que ce soit possible en Ada. Exact ?