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

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 */
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
#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);
}
Comme vous pouvez le constater, j'en suis simplement à la phase initiale (calcul des occurences de chaque octet).

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 :

En tout cas, j'ai testé cette dernière solution qui n'a pas eu l'air de heurter gcc

Pour terminer, j'ai écrit ça pour valider le fonctionnement de mon code :

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);
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
printf ("Indice : %d\n", i);
A ce moment là, j'obtiens ça :

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
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 !

Merci d'avance pour vos réponses.