Erreur de compilation lié à la généricité et type dérivé de Finalizat°

Erreur de compilation lié à la généricité et type dérivé de Finalizat° - Ada - Programmation

Marsh Posté le 09-05-2006 à 21:03:41    

:hello: Bonjour,
 
Dans un projet de developpement d'un petite application faisant appel aux algorithmes de resolution du jeu du Taquin,
J'ai cette erreur de compilation parce que je donne en parametre generique de P_Taquin la procedure put du paquetage p_image_io qui est une instance de text_io.integer_io.
 


no visible subprogram matches the specification for "Afficher"
missing specification for "Width" and other formals with defaults


 
Et je suis bien embété  :heink:  
 
j'utilise Gnat (sous Linux)
 
 

Code :
  1. -- Dans ce programme,
  2.      
  3. --     -- J'initialise un Jeu du Taquin,
  4.       -- durant l'initialisation j'affiche l'image du jeu a chaque initialisation de jeton
  5.  
  6.       -- J'affiche un message
  7.       -- j'attend un caractere
  8.  
  9.       -- Je copie le jeu avec une variable d'un non mieu aproprie a l'operation suivante
  10.       -- Tant que le joueur n'arrete pas le melange,
  11.       -- j'affiche l'image initiale
  12.       -- j'affcihe l'image du jeu
  13.       -- je deplace un jeton
  14.  
  15.       -- Je copie le jeu dans une variable d'un non mieu aproprie a l'operation suivante
  16.       -- tant que l'image de la copie courante /= model
  17.       -- j'affiche l'image initiale
  18.       -- j'affcihe l'image model du jeu
  19.       -- j'affcihe l'image courante du jeu
  20.       -- je deplac deplace un jeton
  21.  
  22.       -- j'affiche l'image initiale
  23.       -- j'affcihe l'image model du jeu
  24.       -- j'affcihe l'image courante du jeu
  25.       -- j'affiche un message
  26.       -- j'attend un caractere


 
 
 
les sources, vite fait
 

Code :
  1. package P_Les_Types_Taquin is
  2.   subtype T_Borne_1 is Positive range 1.. Positive'Last/2;
  3. end P_Les_Types_Taquin;


Code :
  1. with P_Les_Types_Taquin;
  2. use P_Les_Types_Taquin;
  3. generic
  4.   N : T_Borne_1;
  5.   M : T_Borne_1;
  6.   type T_Image is private;
  7.   with procedure Afficher(Une : T_Image);
  8. package P_Taquin is
  9.   type T_Taquin is private;
  10.   subtype T_Borne_2 is natural range 0..(N*M)-1;
  11.   procedure Afficher(Un  : T_Taquin);
  12.   function Sont_Egales(Gauche, Droit : T_taquin) return Boolean;
  13.   procedure Init_Suivant(Le : T_Taquin; Image : T_Image);
  14.   procedure Melange_Deplacer_Un_Jeton(Courant : in out T_taquin);
  15.   procedure trie_Deplacer_Un_Jeton(Model : in T_Taquin; Courant : in out T_taquin);
  16. end P_Taquin;


Code :
  1. with P_Les_Types_Taquin;
  2. use P_Les_Types_Taquin;
  3. generic
  4.   M : T_Borne_1 := 5;
  5.   N : T_Borne_1 := 5;
  6.   S : Boolean := true;
  7. package P_Mon_Appli_Taquin is
  8.   procedure Initialiser;
  9.   procedure Melanger;
  10.   procedure Ordonner;
  11. end P_Mon_Appli_Taquin;


 
C'est la que ça ce passe, a la ligne 15
 

Code :
  1. with P_Taquin;
  2. with Text_Io, Ada.Integer_Text_io;use Text_Io, Ada.Integer_Text_io;
  3. with Ada.Numerics.Discrete_Random;
  4. package body P_Mon_Appli_Taquin is
  5.   function System(Clear : String) return Integer;
  6.   pragma import(C, System, "system" );
  7.   Clear_Return : Integer;
  8.  
  9.  
  10.  
  11.   subtype T_Image is Natural range 0..(N*M)-1;
  12.   package P_Image_Io is new Text_Io.Integer_Io(T_Image);
  13.  
  14.   package P_Mon_Taquin is new P_Taquin(N,M,T_Image,
  15.                                        P_Image_Io.Put);
  16.   use P_Mon_Taquin;
  17.   Taquin_Init, Taquin_Melange, Taquin_Ordonne : T_Taquin;
  18.  
  19.  
  20.   procedure Initialiser is
  21.      type T_Tab_Image is array (natural range 0..(N*M)-1) of T_Image;
  22.      Tab_Image : T_Tab_Image := (others => 0);
  23.      procedure Permute(Tab : in out T_Tab_Image;I,J : T_Borne_2) is
  24.         Tampon : T_Image := Tab(I);
  25.      begin
  26.         Tab(I) := Tab(J);
  27.         Tab(J) := Tampon;
  28.      end Permute;
  29.  
  30.      Package P_T_Borne_2_random is new Ada.Numerics.Discrete_Random(T_Borne_2);
  31.      T_Borne_2_Gen : P_T_Borne_2_Random.Generator;
  32.      use P_T_Borne_2_Random;
  33.  
  34.   begin
  35.      for I in Tab_Image'Range loop
  36.         Tab_Image(I) := I;
  37.      end loop;
  38.      if not S then
  39.         for I in 1..Tab_Image'Length/2 loop
  40.            Permute(Tab_Image,
  41.                    Random(T_Borne_2_Gen),
  42.                    Random(T_Borne_2_Gen));
  43.         end loop;
  44.      end if;
  45.      Put("Taquin initialise" );
  46.      New_Line(2);
  47.      for I in Tab_Image'Range loop
  48.         Init_Suivant(Taquin_Init,Tab_image(I));
  49.         Clear_Return := System("clear" & Ascii.Nul);
  50.         Afficher(Taquin_Init);
  51.      end loop;
  52.      New_Line(22-Count(N));
  53.   end Initialiser;
  54.   procedure Melanger is
  55.      Char : Character;
  56.      task Get_Char is
  57.      end Get_Char;
  58.      task body Get_Char is
  59.      begin
  60.         loop
  61.            Get_Immediate(Char);
  62.            delay 0.1;
  63.         end loop;
  64.      end Get_Char;
  65.   begin
  66.      Taquin_Melange := Taquin_Init;
  67.      while Char /= 'q' loop
  68.         Clear_Return := System("clear" & Ascii.Nul);
  69.         Put("Taquin initialise" );
  70.         New_Line(2);
  71.         Afficher(Taquin_Init);
  72.         Put("Taquin melange" );
  73.         New_Line(2);
  74.         Afficher(Taquin_melange);
  75.         Delay 0.1;
  76.         Melange_Deplacer_Un_Jeton(Taquin_Melange);
  77.      end loop;
  78.   end Melanger;
  79.   procedure Ordonner is
  80.   begin
  81.      Taquin_Ordonne := Taquin_Melange;
  82.      while not sont_Egales(Taquin_Melange,
  83.                            Taquin_Ordonne) loop
  84.         Clear_Return := System("clear" & Ascii.Nul);
  85.         Put("Taquin initialise" );
  86.         New_Line(2);
  87.         Afficher(Taquin_Init);
  88.         Put("Taquin melange" );
  89.         New_Line(2);
  90.         Afficher(Taquin_melange);
  91.         Put("Taquin ordonne" );
  92.         New_Line(2);
  93.         Afficher(Taquin_ordonne);
  94.         Trie_Deplacer_Un_Jeton(Taquin_Melange,Taquin_Ordonne);
  95.      end loop;
  96.      Put("Taquin initialise" );
  97.      New_Line(2);
  98.      Afficher(Taquin_Init);
  99.      Put("Taquin melange" );
  100.      New_Line(2);
  101.      Afficher(Taquin_melange);
  102.      Put("Taquin ordonne" );
  103.      New_Line(2);
  104.      Afficher(Taquin_ordonne);
  105.   end Ordonner;
  106. end P_Mon_Appli_Taquin;


Code :
  1. with P_Les_Types_Taquin; use P_Les_Types_Taquin;
  2. with P_Mon_Appli_Taquin;
  3.  
  4. with Ada.Command_Line;
  5. use Ada.Command_Line;
  6.  
  7. with Text_Io; use Text_Io;
  8. procedure Main is
  9.   Char : Character := ' ';
  10.   package Jeu_De_Taquin is new P_Mon_Appli_Taquin
  11.     (T_Borne_1'Value(Argument(1)),
  12.      T_Borne_1'Value(Argument(2)),
  13.     Boolean'Value(Argument(3)));
  14. begin
  15.   while Char /= Character'Val(10) loop
  16.      begin
  17.         Jeu_De_Taquin.Initialiser;
  18.         Put("Appuyez sur un touche pour continuer" );
  19.         Get_Immediate(Char);
  20.         Jeu_De_Taquin.Melanger;
  21.         Jeu_De_Taquin.Ordonner;
  22.         Put("Fin de programme ; Appuyez sur Entree pour recommencer" );
  23.         Get_Immediate(Char);
  24.      exception
  25.         when others =>
  26.            raise;
  27.      end;
  28.   end loop;
  29. end Main;


Message édité par Profil supprimé le 10-05-2006 à 13:05:50
Reply

Marsh Posté le 09-05-2006 à 21:03:41   

Reply

Marsh Posté le 10-05-2006 à 09:59:51    

J'ai cette autre erreur de compilaton
 


instantiation error at p_taquin.ads:32
parent type must not be outside generic body


 
Et je suis bien embété aussi  :heink:  
 
La scpecification de p_taquin est la suivante
 

Code :
  1. with P_Les_Types_Taquin;
  2. use P_Les_Types_Taquin;
  3. with Ada.Finalization;
  4. with Ada.Unchecked_Deallocation;
  5. generic
  6.   N : T_Borne_1;
  7.   M : T_Borne_1;
  8.   type T_Image is private;
  9.   with procedure Afficher(Une : T_Image);
  10. package P_Taquin is
  11.   type T_Taquin is limited private;
  12.   subtype T_Borne_2 is natural range 0..(N*M)-1;
  13.   procedure Afficher(Un  : T_Taquin);
  14.   procedure Copier(Source,Destination : in out T_Taquin);
  15.   function Sont_Egales(Gauche, Droit : T_taquin) return Boolean;
  16.   procedure Init_Suivant(Le : in out T_Taquin; Image : T_Image);
  17.   procedure Melange_Deplacer_Un_Jeton(melange : in out T_taquin);
  18.   procedure trie_Deplacer_Un_Jeton(Model : in out T_Taquin;
  19.                                    ordonne : in out T_taquin);
  20.   procedure Vider(Un : in out T_Taquin);
  21. private
  22.   type T_Jeton;
  23.   type T_Liste_De_Jeton is access T_Jeton;
  24.   type T_Tab_Jeton is array (Positive range <>,
  25.                              Positive range <> ) of T_Liste_De_jeton;
  26.   type T_Matrice(N : T_Borne_1;
  27.                  M : T_Borne_1) is
  28.      record
  29.         Tab_Jeton : T_Tab_Jeton(1..N,1..M) := (others => (others => null));
  30.      end record;
  31.  
  32.   type T_Jeton is
  33.      record
  34.         Suivant : T_Liste_De_Jeton;
  35.         Id_Jeton : T_Borne_2 := 0;
  36.         Id_Up : T_Borne_2 := 0;
  37.         Id_Down : T_Borne_2 := 0;
  38.         Id_Left : T_Borne_2 := 0;
  39.         Id_Right : T_Borne_2 := 0;
  40.         Image : T_Image;
  41.      end record;
  42.   type T_Taquin is new Ada.Finalization.Limited_Controlled with
  43.      record
  44.         Matrice    : T_Matrice(N,M);
  45.         Liste_Du_Taquin : T_Liste_De_Jeton := null;
  46.         Courant : T_Liste_De_Jeton := null;
  47.      end record;
  48.   procedure Liberer is new
  49.     Ada.Unchecked_Deallocation (T_Jeton,T_Liste_De_Jeton);
  50.   procedure Finalize(Un : in out T_Taquin) renames Vider;
  51. end P_Taquin;


 
Les sources de mon jeu du Taquin sont disponibles ICI
 
Avec ObjectAda l'erreur est celle-ci


LRM:3.9.1(4), A type extension may not be declared in a generic body if the parent type is declared outside that body; this applies to the visible part of a generic instantiation


LRM:3.9.1(4)


Message édité par Profil supprimé le 10-05-2006 à 11:07:57
Reply

Marsh Posté le 10-05-2006 à 20:18:28    

LRM 3.9.1(4)
 


The parent type of a record extension shall not be a class-wide type. If the parent type is nonlimited, then each of the components of the record_extension_part shall be nonlimited. The accessibility level (see 3.10.2) of a record extension shall not be statically deeper than that of its parent type. In addition to the places where Legality Rules normally apply (see 12.3), these rules apply also in the private part of an instance of a generic unit.


 
mais je comprends pas ce que dis le monsieur, c'est à dire, je parle pas anglais  :cry:

Reply

Marsh Posté le 15-12-2006 à 17:10:21    


 
 
une traduction googlienne:  


Le type de parent d'une prolongation record ne sera pas un type classe-large. Si le type de parent est sans limite, alors chacun des composants du record_extension_part sera sans limite. Le niveau d'accessibilité (voir 3.10.2) d'une prolongation record ne sera pas statiquement plus profond que celui de son type de parent. En plus des endroits où les règles de légalité s'appliquent normalement (voir 12.3), ces règles s'appliquent également dans la partie privée d'un exemple d'une unité générique.


 
(J'avous que la. je ne comprend pas ce qu'il me dis  ?)

Reply

Sujets relatifs:

Leave a Replay

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