Creation d une table de conversion - Ada - Programmation
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.
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
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