Salut,
Je pratique le c depuis peu (pour le plaisir) et je cherche à implémenter un petit programme de compression utilisant l'algorithme de huffman.
J'ai écrit le code suivant :
huffman.h
huffman.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #ifndef __HUFFMAN_H #define __HUFFMAN_H #include "huffman.h" void parser (const char *f, unsigned long int t[256]) { FILE *fp; char buffer; if ((fp = fopen (f, "r")) == NULL) { fprintf (stderr, "Echec de l'ouverture du fichier %s", f); perror (" "); exit (1); } while (1) { if (fread (& buffer, sizeof (char), 1, fp) == 1) { t[buffer]++; } else { break; } } fclose (fp); } #endif /* __HUFFMAN_H */
Comme vous pouvez le constater, j'en suis simplement à la phase initiale (calcul des occurences de chaque octet).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include<stdio.h> #include<stdlib.h> #include "huffman.h" const char *file; unsigned long int tab[256]; int main (int argc, char *argv[]) { file = argv[1]; int i; for (i=0 ; i<256 ; i++) { tab[i]=0; } parser (file, tab); }
En fait, je ne sais pas si je procède de la meilleure des façons : venant du perl, je ne suis pas habitué à manipuler les types de données. Ici, j'ai défini un buffer de type char (pour y stocker un octet), mais je ne sais pas d'une part si je récupère une valeur décimale avec fread, et d'autre part si l'écriture :
est valable, ou si je dois réaliser un cast de la sorte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part t[buffer]++;
En tout cas, j'ai testé cette dernière solution qui n'a pas eu l'air de heurter gcc
Code : Sélectionner tout - Visualiser dans une fenêtre à part t[(int)buffer]++;![]()
Pour terminer, j'ai écrit ça pour valider le fonctionnement de mon code :
Et je me tape une vielle erreur de segmentation, ça fonctionne juste si je conserve la première partie du printf comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 for (i=0 ; i<256 ; i++) { if (tab[i] != 0) { printf ("Indice : %d, valeur : %d\n", i, tab[i]); } } return (0);
A ce moment là, j'obtiens ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part printf ("Indice : %d\n", i);
Houla, je viens de me rendre que le code plante si je lui passe autre chose qu'un fichier texte en argument, je crois qu'il y a du boulot en perspective... Si une âme charitable pouvait me donner quelques indications, j'aimerais vraiment progresser en c !Indice : 10
Indice : 32
Indice : 38
Indice : 45
Indice : 46
Indice : 47
Indice : 48
Indice : 49
Indice : 50
Indice : 51
Indice : 52
Indice : 53
Indice : 54
Indice : 56
Indice : 58
Indice : 60
Indice : 61
Indice : 62
Indice : 67
Indice : 71
Indice : 95
Indice : 97
Indice : 98
Indice : 99
Indice : 100
Indice : 101
Indice : 102
Indice : 103
Indice : 104
Indice : 105
Indice : 107
Indice : 108
Indice : 109
Indice : 110
Indice : 111
Indice : 112
Indice : 113
Indice : 114
Indice : 115
Indice : 116
Indice : 117
Indice : 118
Indice : 119
Indice : 120
Indice : 122
Merci d'avance pour vos réponses.
Partager