[C]Pb champ de bit/huffmann

Pb champ de bit/huffmann [C] - C - Programmation

Marsh Posté le 13-02-2006 à 18:19:29    

Bonjour, je suis en train de faire un mini projet ou l'on doit faire un pseudo code de huffmann(pour compresser un fichier)==>  
 
On doit lire le fichier txt en parametre, faire un tableau d'occurence des lettres trouvées, les classer par ordre d'apparition :
Mn fichier :
SALUUTTTT
 
tab:
 
T 4   U 2  S 1 ....
puis ensuite créer un code pour chaque lettre :
 
T= 1  U= 01 S= 001.....
le code crée est en fait un code ou on rajoute un zero a chaque lettre, le principe est que les lettres les plus présentes seront codé sur 1 bit alors que celles moins presentes seront codé sur plusieurs bits mais on s'en fout car elles sont pas tres presentes.
 
L'interet de ce programme est tt simplement de faire du C, car ce pseudo huffman sera efficace dans le seul cas ou on a bcp bcp d'occurences de quelques lettres et quelques occurence des autres.
 
Pour l'instant, j ai mon tab d'occurence en memoire, j ai un tableau trié a 2 dimensions contenant seulement des cases ou l'occurence est differenete de 0:
 
H       B             s
13      5             2 ................
 
Maintenant mon pb c'est pour encoder mon fichier avec mon nouveau code :
J'avais crée un fichier txt contenant mon code pour chaque lettre mais c'est galere a utiliser,  
la je cherche tout d'abord a generer mon code dans un tab en memoire, mais je trouve pas de solution pour concatenter un 0 a chaque fois??
Ensuite, il faut coder mon fichier en ecrivant des bits et non des octets bien entendu pour gagner de la place,  
Un ami m'a parlé des champs de bits ou je pourrai ecrire une voire plusieurs lettres dans une structure de bit, mais je ne vois pas comment gerer une lettre qui aurait pour code 0000000000000000000001 par ex.
De plus, avec quelle fonction ecrireriez vous une struct pareil(pour que tte la struct n'occupe qu'un octet!)
 
Merci d'avance. :(

Citation :


Reply

Marsh Posté le 13-02-2006 à 18:19:29   

Reply

Marsh Posté le 13-02-2006 à 19:13:20    

up ; )

Reply

Marsh Posté le 13-02-2006 à 21:24:43    

personne??????

Reply

Marsh Posté le 14-02-2006 à 09:52:20    

Reply

Marsh Posté le 14-02-2006 à 09:53:21    

Pour gérer les champs de bits, il faut utiliser les opérateurs sur les bits ( >>, <<, &, |, ~)...
 
A toi de te faire ta petite lib de manipulation avec ces opérateurs de base pour rendre les choses plus simples.

Reply

Marsh Posté le 14-02-2006 à 13:03:55    

thank you, j vai essayer tout ca,
 
en attendant, une question facile mais que je trouve pas:
 
J'ai le droit d'ecrire char c = 'A';  (lettre)
                    ou      char c= 65; (decimal)
                       ou   char c = 0x41 ou un truc comme ca  (hexa)
 
ca affiche pareil, mais pour ecrire mon char c en binaire je fais comment??? Pour lui donner une valeur mais en binaire (qui correspon a une lettre ds la table ascii bien sur)??
 
 
   

Reply

Marsh Posté le 14-02-2006 à 13:31:35    

moulax a écrit :

en attendant, une question facile mais que je trouve pas:
 
J'ai le droit d'ecrire char c = 'A';  (lettre)
                    ou      char c= 65; (decimal)
                       ou   char c = 0x41 ou un truc comme ca  (hexa)
 
ca affiche pareil, mais pour ecrire mon char c en binaire je fais comment??? Pour lui donner une valeur mais en binaire (qui correspon a une lettre ds la table ascii bien sur)??


Il n'y a pas de méthode standard[1], mais tu n'en a probablement pas besoin.
 
------------------------
[1] a part  

int x = strtoul ("01010101", NULL, 2);


mais je doute fort que tu ai besoin de ça...


Message édité par Emmanuel Delahaye le 14-02-2006 à 13:32:03

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-02-2006 à 16:18:53    

ca peut toujours servir : ) merci

Reply

Marsh Posté le 14-02-2006 à 16:28:54    

j'ai fait les test suivant:
 
char x = strtoul ("01000001", NULL, 2); //01000001 correspon au code de A dans la table ascii
printf("%d\n",x);  ==> 65
printf("%c\n",x); ==> A
printf("%d\n",sizeof(x)); ==> 1
 
donc apparemment je peux aussi convertir en char et en plus ma chaine ne fait qu'un octet apparemment!!
ca fait peu bizarre mais ca a l'air de fonctionner !qu'est ce que t'en pense??ya pas de risque à convertir en char??
 

Reply

Sujets relatifs:

Leave a Replay

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