Problème de généricité avec Ada

Problème de généricité avec Ada - Ada - Programmation

Marsh Posté le 23-02-2011 à 10:56:46    

Bonjour, j'ai un problème de généricité avec Ada.
je souhaite construire des listes avec des items d'un type qui est par ailleurs partagé en deux sous-type.
 
Je fais pété le code se sera peut-être le plus simple.
 
 
La bibliothèque parente ::=  

Code :
  1. generic
  2.   Max_Words : Positive;
  3.   Max_Names : Positive;
  4.   Path      : String;
  5.   Basename  : String;
  6.   Extension : String;
  7. package Chaos is
  8.   type Id_Type is new Natural range 0..(Max_Words+Max_Names)-1;
  9.   subtype Word_Type is Id_type range 0..Id_Type(Max_Words-1);
  10.   subtype Name_Type is Id_type range Id_Type(Max_Words)..Id_Type((Max_Words+Max_Names)-1);
  11. end Chaos;


 
La liste ::

Code :
  1. generic
  2. package Chaos.List is
  3.   type List_Type is private;
  4.   function Ieme(Current : in List_Type; I : in positive) return Id_Type;
  5.   procedure Print(Current : in List_Type);
  6.   procedure Add(Item : in Id_Type; To : in out List_type);


 
Le glossaire :: j'en instancie un pour chacun des espace d'id_type partagé mar Max_Words.

Code :
  1. with Chaos.Tree;
  2. with Ada.Strings.Unbounded;
  3. generic
  4.   type T_Language is (<> );
  5. package Chaos.Glossary is
  6.   type Glossary_Type is limited private;
  7.  
  8.   function Keyword(Word : in String;
  9.                    Glossary : in Glossary_type) return T_Language;
  10.   function Image(Item : in T_Language;
  11.                  Glossary : in Glossary_type) return String;
  12.  
  13.   -- Ajouter un item.
  14.   procedure Add(Word : in String;
  15.                 Glossary : in out Glossary_Type);


 
le paquetage qui construit les list à partir des glossaires.

Code :
  1. with Chaos.List;
  2. with Chaos.Glossary;
  3. with Ada.Unchecked_Deallocation;
  4. generic
  5.   with package Names_Glossary is new Glossary(<> );
  6.   with package Words_Glossary is new Glossary(<> );
  7. package Chaos.Logos is
  8.  
  9.   package List is new Chaos.List;


 
Le main file ::

Code :
  1. with Chaos;
  2. with Chaos.Glossary;
  3. with Chaos.Logos;
  4. with Chaos.Chaos;
  5. with Chaos.Machina;
  6. with Ada.Command_Line;
  7. use Ada.Command_Line;
  8. procedure Main is
  9.  
  10.   Max_Words : positive := 4096;
  11.   Max_names : positive := 4096;
  12.   Path      : access String := new String ' ("Arche/" );
  13.   Basename  : access String := new String ' ("board" );
  14.   Extension : access String := new String ' (".txt.iso" );
  15.   Max_Stack : Positive := 64;
  16.   Max_Network : Positive := 32;
  17.   Argument_Error : exception;
  18. begin
  19.   if Argument_Count /= 0 then
  20.      if Argument_Count /= 7 then
  21.         raise Argument_Error;
  22.      end if;
  23.      begin
  24.         Max_Words := Integer'Value(Argument(1));
  25.         Max_Names := Integer'Value(Argument(2));
  26.      exception
  27.         when Constraint_Error =>
  28.            raise Argument_Error;
  29.      end;
  30.   end if;
  31.   declare
  32.      package substrat is new chaos(Max_Words,
  33.                                    Max_Names,
  34.                                    Path.all,
  35.                                    Basename.all,
  36.                                    Extension.all);
  37.      use Substrat;
  38.      package Names is new Substrat.Glossary(Name_Type);
  39.      package Words is new Substrat.Glossary(Word_Type);
  40.      package Univers is new Substrat.Logos(Names, Words);
  41.      package Ether is new Substrat.Chaos(Max_Stack, Max_Network, Univers);
  42.      package Zeus is new Substrat.Machina(Ether);
  43.   begin
  44.      Zeus.Main;
  45.   end;
  46. end Main;


 
Le problème c'est que dans le corps de chaos-logos, lorsque j'appelle list.add je fournis un item de type T_Langage tiré de chaos-glossary à list.add qui attend un Id_type.
 
Ici..

Code :
  1. List.Add(Names_Glossary.Keyword(Word(1..Index),Names), Current);


 
 
Comment faire ? S'il vous plait, merci.


Message édité par Profil supprimé le 23-02-2011 à 11:07:51
Reply

Marsh Posté le 23-02-2011 à 10:56:46   

Reply

Marsh Posté le 23-02-2011 à 11:22:33    

:heink: j'ai trouvé... Je suis nul.
 
Il suffisait de modifier le Chaos.Glossary comme suit :

Code :
  1. with Chaos.Tree;
  2.    with Ada.Strings.Unbounded;
  3.    generic
  4.      type T_Language is range <>;
  5.    package Chaos.Glossary is


Et d'effectuer quelque conversion de type.
 
J'avais essayé de convertir, mais ça me disait "invalide operand in conversion".
 
Merci.


Message édité par Profil supprimé le 23-02-2011 à 11:22:51
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed