Désolé de poster un énième topic sur le sujet mais bien qu'ayant lu attentivement quelques uns des précédents, je n'arrive pas à mettre en oeuvre de solution élégante à mon problème (je débute en c).
J'essaye d'écrire un programme de compression utilisant l'algorithme de Huffman. En l'état actuel des choses, j'ai créé un tableau de 256 compteurs qui est correctement initialisé (fonction read_file). Je bute sur l'écriture de la fonction qui doit créer le tableau de fréquences. Le code complet :
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 #ifndef H_HUFFMAN #define H_HUFFMAN typedef struct { int value; unsigned long int frequency; } s_frequency; void read_file (const char *, unsigned long int []); void create_frequencies_array (unsigned long int [], s_frequency []); #endif /* guard */
main.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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 #include<stdio.h> #include<stdlib.h> #include "huffman.h" void read_file (const char *file, unsigned long int a_counters[]) { FILE *fp; int i; if ((fp = fopen (file, "rb")) == NULL) { fprintf (stderr, "Echec de l'ouverture du fichier %s", file); perror (" "); exit (1); } while ((i = fgetc (fp)) != EOF) { a_counters[i]++; } fclose (fp); } void create_frequencies_array (unsigned long int a_counters[], s_frequency a_frequencies[]) { int i = 0; int j = 0; for (i=0 ; i<256 ; i++) { if (a_counters[i] != 0) { j++; } } a_frequencies = malloc (j*sizeof(s_frequency)); for (i=0 ; i<256 ; i++) { j = 0; if (a_counters[i] != 0) { a_frequencies[j].value = i; a_frequencies[j].frequency = a_counters[i]; } } }
La fonction create_frequencies_array admet un tableau en argument, ce tableau étant modifié par la fonction. Est-ce une meilleure solution de ne pas déclarer le tableau dans la fonction main et de retourner un pointeur en sortie de la fonction create_frequencies_array ? La zone mémoire allouée sera-t-elle visible de la fonction main (j'ai vu que certains utilisaient des pointeurs de pointeurs)?
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 #include<stdio.h> #include "huffman.h" const char *p_file; unsigned long int a_counters[256] = {0}; s_frequency a_frequencies[]; int main (int argc, char *argv[]) { p_file = argv[1]; read_file (p_file, a_counters); create_frequencies_array (a_counters, a_frequencies); return (0); }
De plus, dans un cas ou dans l'autre, je ne vois pas de moyen simple pour connaître la taille du tableau une fois que l'on retourne à la fonction main.
Voilà, je vous serais vraiment reconnaissant d'éclairer ma lanterne...
Partager