Question de généricité

Liste des GroupesRevenir à fcl ada 
Sujet : Question de généricité
De : 314 (at) *nospam* drpi.fr (DrPi)
Groupes : fr.comp.lang.ada
Date : 29. Aug 2023, 23:27:44
Autres entêtes
Organisation : Posted through news.alphanet.ch
Message-ID : <uclnsh$fii$1@shakotay.alphanet.ch>
User-Agent : Mozilla Thunderbird
Bonjour,
Une question sur un problème de généricité.
J'ai les types suivants :
    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);
char_array vient de la bibliothèque standard Interfaces.C.
Sa définition est :
type char_array is array (size_t range <>) of aliased char;
J'ai créé une fonction de conversion générique comme suit :
    generic
       Char_Array_Length : Natural;
    function To_TW_STR (Item : String) return char_array;
    function To_TW_STR (Item : String) return char_array is
    begin
       return Result : char_array (0 .. size_t(Char_Array_Length - 1)) with Relaxed_Initialization do
          for J in Item'Range loop
             Result (size_t (J - Item'First)) := To_C (Item (J));
          end loop;
          Result (size_t(Item'Last + 1)) := nul;
       end return;
    end To_TW_STR;
Et je crée des instanciations comme ceci :
    function To_TW_STR32  is new To_TW_STR (t_TW_STR32'Length);
    function To_TW_STR64  is new To_TW_STR (t_TW_STR64'Length);
    function To_TW_STR128 is new To_TW_STR (t_TW_STR128'Length);
    function To_TW_STR255 is new To_TW_STR (t_TW_STR255'Length);
Jusque là, tout va bien. Cela fonctionne très bien pour mon usage.
Pour ma connaissance, j'aimerais créer une fonction "plus générique". C'est à dire, passer un type générique au lieu de coder en dur le type retourné.
Quelque chose comme ceci :
    generic
       type T is private;  -- private ???
    function To_TW_STR (Item : String) return T;
    function To_TW_STR (Item : String) return T is
    begin
       return Result : T  do
          for J in Item'Range loop
             Result (size_t (J - Item'First)) := To_C (Item (J));
          end loop;
          Result (size_t(Item'Last + 1)) := nul;
       end return;
    end To_TW_STR;
    function To_TW_STR32  is new To_TW_STR (t_TW_STR32);
    function To_TW_STR64  is new To_TW_STR (t_TW_STR64);
    function To_TW_STR128 is new To_TW_STR (t_TW_STR128);
    function To_TW_STR255 is new To_TW_STR (t_TW_STR255);
Mais le compilateur n'aime pas.
Il me semble qu'une écriture possible est la suivante :
    generic
       type Item_Type is private;
       type Index_Type is (<>);
       type Array_Type is array (Index_Type) of 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 with Relaxed_Initialization do
          for J in Item'Range loop
             Result (size_t (J - Item'First)) := To_C (Item (J));
          end loop;
          Result (size_t(Item'Last + 1)) := nul;
       end return;
    end To_TW_STR;
Mais je n'arrive pas l'instancier.
Comment faire ?
Nicolas

Date Sujet#  Auteur
29 Aug 23 * Question de généricité14DrPi
30 Aug 23 `* Re: Question de généricité13Gautier write-only address
30 Aug 23  `* Re: Question de généricité12DrPi
30 Aug 23   `* Re: Question de généricité11Gautier write-only address
31 Aug 23    `* Re: Question de généricité10DrPi
1 Sep 23     `* Re: Question de généricité9Gautier write-only address
1 Sep 23      `* Re: Question de généricité8DrPi
1 Sep 23       +* Re: Question de généricité3Gautier write-only address
2 Sep 23       i`* Re: Question de généricité2DrPi
2 Sep 23       i `- Re: Question de généricité1DrPi
2 Sep 23       `* Re: Question de généricité4J-P. Rosen
2 Sep 23        `* Re: Question de généricité3DrPi
15 Sep 23         `* Re: Question de généricité2Thomas
16 Sep 23          `- Re: Question de généricité1DrPi

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal