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 :
generic Max_Words : Positive; Max_Names : Positive; Path : String; Basename : String; Extension : String; package Chaos is type Id_Type is new Natural range 0..(Max_Words+Max_Names)-1; subtype Word_Type is Id_type range 0..Id_Type(Max_Words-1); subtype Name_Type is Id_type range Id_Type(Max_Words)..Id_Type((Max_Words+Max_Names)-1); end Chaos;
|
La liste ::
Code :
generic package Chaos.List is type List_Type is private; function Ieme(Current : in List_Type; I : in positive) return Id_Type; procedure Print(Current : in List_Type); 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 :
with Chaos.Tree; with Ada.Strings.Unbounded; generic type T_Language is (<> ); package Chaos.Glossary is type Glossary_Type is limited private; function Keyword(Word : in String; Glossary : in Glossary_type) return T_Language; function Image(Item : in T_Language; Glossary : in Glossary_type) return String; -- Ajouter un item. procedure Add(Word : in String; Glossary : in out Glossary_Type);
|
le paquetage qui construit les list à partir des glossaires.
Code :
with Chaos.List; with Chaos.Glossary; with Ada.Unchecked_Deallocation; generic with package Names_Glossary is new Glossary(<> ); with package Words_Glossary is new Glossary(<> ); package Chaos.Logos is package List is new Chaos.List;
|
Le main file ::
Code :
with Chaos; with Chaos.Glossary; with Chaos.Logos; with Chaos.Chaos; with Chaos.Machina; with Ada.Command_Line; use Ada.Command_Line; procedure Main is Max_Words : positive := 4096; Max_names : positive := 4096; Path : access String := new String ' ("Arche/" ); Basename : access String := new String ' ("board" ); Extension : access String := new String ' (".txt.iso" ); Max_Stack : Positive := 64; Max_Network : Positive := 32; Argument_Error : exception; begin if Argument_Count /= 0 then if Argument_Count /= 7 then raise Argument_Error; end if; begin Max_Words := Integer'Value(Argument(1)); Max_Names := Integer'Value(Argument(2)); exception when Constraint_Error => raise Argument_Error; end; end if; declare package substrat is new chaos(Max_Words, Max_Names, Path.all, Basename.all, Extension.all); use Substrat; package Names is new Substrat.Glossary(Name_Type); package Words is new Substrat.Glossary(Word_Type); package Univers is new Substrat.Logos(Names, Words); package Ether is new Substrat.Chaos(Max_Stack, Max_Network, Univers); package Zeus is new Substrat.Machina(Ether); begin Zeus.Main; end; 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 :
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