Creation d une table de conversion

Creation d une table de conversion - Ada - Programmation

Marsh Posté le 17-04-2003 à 18:48:31    

J ai un arbre de Huffamn, arbre dont les feuilles contiennent des caracteres...
 
je voudrais creer une table de correspondance
caractere - code de huffman
en utilisant un tableau indexe par les caracteres
 
il s agit d explorer tout l arbre
quand on part a gauche, on ajoute un zero au code
sinon  un un
quand on arrive sur une feuille, on met le code dans le tableau
 
le code est une liste qui grandit lors de l exploration de l arbre
 
 
Voila mon prog... qui ne marche pas :cry:
 
Les Specifications:
   ----------------------------------------------
   -- Pour obtenir le code de chaque caractere --
   ----------------------------------------------
 
   --| les codes ayant une longueur variable, on utilise la structure de liste
 
   type Element;
   type Code is access Element;
   type Element is record
      B : Bit;
      Suivant : Code;
   end record;
 
 
   type Table is array (Character) of Code;  
   
   Table_Vide : Constant Table := (others => null);
   
   
   --| on creer une table de correspondance pour eviter d'avoir a reparcourir  
   --| l'arbre plusieurs fois pour le meme caractere
   
   
   
   procedure Inserer_En_Queue (Suite_Code: in Bit;  
                               Codage_Car : in out Code);
       
   procedure Creer_Table (T : out Table;
               A : in     Arbre);
 
Le corps:
   ----------------------
   -- Inserer_En_Queue --
   ----------------------
 
 
   procedure Inserer_En_Queue (Suite_Code: in Bit;  
                               Codage_Car : in out Code) is
      Der_Code : Code := Codage_Car;
   begin
      if Der_Code /= null then
         while Der_Code.Suivant /= null loop
            Der_Code := Der_Code.Suivant;
         end loop;
  Der_Code.Suivant := new Element'(Suite_Code, null);
      else
         Der_Code := new Element'(Suite_Code, null);
      end if;
   end Inserer_En_Queue;
 
 
 
   -----------------
   -- Creer_Table --
   -----------------
   
   procedure Creer_Table (T : out Table;
               A : in  Arbre) is
      Codage : Code := null;  
      Tab : Table := Table_Vide;
         
      procedure Creer_Table_iter (T : in out Table;
                       A : in  Arbre) is
         Arb : Arbre := A;
      begin
         if Est_Feuille (Arb) then  
            T(L_Info_Feuille(Arb)) := Codage;
         else  
            Inserer_En_Queue(0, Codage);
            Creer_Table_Iter (T, Gauche (Arb));
     Inserer_En_Queue(1, Codage);
     Creer_Table_Iter (T, Droit (Arb));
         end if;
      end Creer_Table_Iter;
   
   begin
      Creer_Table_iter (Tab, A);
      T := Tab;
   end Creer_Table;
 
 
merci d avance :jap:

Reply

Marsh Posté le 17-04-2003 à 18:48:31   

Reply

Marsh Posté le 17-04-2003 à 19:46:59    

Salut,
 
Je pense que ton problème est lié à l'effet de bord de la variable Codage dans la procedure Creer_Table_iter.
 
En effet dans Creer_Table_iter, au premier appel on passe à gauche, et au seconde appel, on passe à droite de l'arbre et on ajoute le codage '0' à la lettre la plus utilisé, car c'est une feuille. Au retour de cet appel, on ajoute le bit 1 à la file donc on a '01' ce qui n'existe pas... Tu gardes toujours les bits précédents dans la variable globale Codage.
 
Un problème de plus sur ta structure de données, il y a conflit de référence, car tu modifie la file à chaque appel, mais le pointeur de tête pointe au même endroit... A la fin tous les lettres auront le même codage. Car il n'y a qu'une seule file...
 
Je parle de file, car tu utilise la liste comme une file. Il te faudrait ajouter la procedure pour supprimer des elements de tête. Le mieux, je pense, serait de créer un type File spécifique dans un paquetage, pour contrer le problème de référence.

Reply

Marsh Posté le 18-04-2003 à 11:22:19    

merci :)

Reply

Sujets relatifs:

Leave a Replay

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