Bonsoir,
J'effectue actuellement un programme sur la compression topologique,lors de la compilation j'ai pas de problême cependant lorsque je l'execute j'ai un segmentation fault.
voila mon code source il est assez grand je suis désolée j'espere que vous pourrez comprendre malgré les commentaires.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
 
/* Fichier d'en-tête */
#include <stdio.h>
#include <stdlib.h>
 
/*Prototypes*/
int read_file(char freq[256],FILE *fichier);
char carac_plu_frequent(char freq[256]);
char lecture_8octets_aff_topo(char tab[8],FILE *fichier,char freq[256]);
char miseaX (int x,int i,char c);
 
/*Fonction read_file permettant de lire le fichier et de stocker les caractere dans un tableau ce qui permettra de voir le nombre de caractere et le caractere le plus frequent*/
int read_file(char freq[256],FILE *fichier)/*Elle renvoi un int normal c'est le nombre de caractere*/
{
	int nb_carac;/*Variable de type entier pour le nombre de caractere*/
	int i;/*Pour la scrutation*/
	char c;/*Pour stocker les caractere scruter*/
 
	fichier = fopen("fichier.txt","r+");/*On ouvre le fichier qu'on veut lire*/
	nb_carac = 0;/*on met a 0 le nombre de caractere*/
 
	for(i=0;i<256;i++)/*On met toutes les cases du tableau à 0*/
	{
		freq[i] = 0;/* voila qui est fait ...*/
	}
 
	if(fichier == NULL)/*On verifie bien que le fichier existe*/
	{
		printf("Erreur pendant la lecture du fichier\n");
		exit(0);/*On sort du programme si le fichier n'existe pas*/
	}
 
	while(!feof(fichier))/*Tant qu'on est pas arrivé a la fin du fichier*/
	{
		c = fgetc(fichier);/*c prend la valeur d'un caractere*/
		freq[c] = freq[c] + 1;/*dans le tableau on increment la case du tableau correspondant a la valeur ASCII du caractere*/
		nb_carac++;/*Sert a compter le nombre de caractere*/
	}
	nb_carac = nb_carac - 1; /*C'est bizare ca lit un caractère en plus ...*/
	return nb_carac;/*La fonction retourne le nombre de caractere au cas ou on en aurai besoin*/
}
 
/*fonction carac_plu_frequent permettant en sorti de voir le fichier le plus frequent dans le fichier*/
char carac_plu_frequent(char freq[256])/*Elle renvoi un caractere ( le plus frequent )*/
{
	int frequence_max_du_carac ;/*Permet de stocker le nombre de fois qu' un caractere  est present*/
	int carac_plus_frequent;/*Permet de stocker le caractere le plus fréquent*/
	int i;/*Pour la scrutation*/
 
	carac_plus_frequent = 0; /*On met a 0 ....(normal)*/
	frequence_max_du_carac = 0;/*On met a 0 ....(normal)*/
 
	for(i=0;i<256;i++) /* on scrut le tableau de caractere afin de determiner le caractere le + fréquent */
	{
		if(freq[i] > frequence_max_du_carac)/*Si le nombre de caractere est superieur au debut a 0 alors on entre*/
		{
			carac_plus_frequent = i; /*le caractere le plus fréquent prend alors la valeur de i */
			frequence_max_du_carac = freq[i]; /*Et le nombre de fois qu'apparai le caractere est mis dans la variable frequence_max*/
		}
	}
	printf("Le caractere le plus fréquent apparait %d fois \n",frequence_max_du_carac);
	return carac_plus_frequent;/*On retourne le fameux caractere */
}
 
/*Fonction lecture_8octets_aff_topo permettant de lire 8 caractere et d'en sortir le topologique */
char lecture_8octets_aff_topo(char tab[8],FILE *fichier,char freq[256]) 
/*elle renvoi le caractere topologique*/
{	
	char temp;/*Temp sera ici le caractere le plus frequent (on appelera la fonction précédente) */
	char c;/*C servira pour stocker les caractere lu dans le fichier */
	int i;/*tjs pour la scrutation */
	char topo ;/*topo sera le nombre topologique */ 
 
		for(i=0;i<8;i++)
		{
			tab[i] = 0;
		}
 
		temp = 0;
		for(i=0;i<8;i++)/*On veut 8 caractere donc de 0 a 7 */
		{
			c =0;/*on met c a 0 normal */
			if(!feof(fichier))/*Si on est pas arriver a la fin du fichier on fait ...*/
			{
				c = fgetc(fichier);/*c prend la valeur d'un caractere*/
			}
		tab[i] = c;/*tab[i] prend la valeur de c pour tab allant de 0 a 7 inclus*/
		}
 
		topo = 0; /*Normal*/	
		temp = carac_plu_frequent(freq);
		for(i=0;i<8;i++)
		{	
			if(tab[i] == temp) /*si tab[i] est notre caractere le plus fréquent */
			{
				topo = miseaX(1,7-i,topo); /*Donc la ....on fait un maskage 00000000 | 00000001 : pour i = 0 il n'y a pas de decalage donc si tab[i] = temp le bit de poit faible = 1 .. etc .. */ 
			}
		}
		return topo;/*on retourne le topologique */
}
 
char miseaX (int x,int i,char c)
{
	if(x == 0)
	{
		return(c&~(1<<i));
	}
	else
	{
		return(c|(1<<i));
	}
}
 
int main(void)
{
	FILE *fichier;
	char topo;
	char tab[8];
	char freq[256];
	int n;
	char c;
 
	n = read_file(freq,fichier);
	printf("Le fichier contient : %d caractere(s)\n",n);
 
	c = carac_plu_frequent(freq);
	printf("Le caractere le plus fréquent dans le fichier est : %c\n",c);
 
	fseek(fichier,0,0);
	topo = lecture_8octets_aff_topo(tab,fichier,freq);
	printf("Le caractere topologique est : %c",topo);
 
	fclose(fichier);
	return 0;
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
$ gcc -o compression compression.c -lm
compression.c:156:2: warning: no newline at end of file
$./compression
Le fichier contient : 9 caractere(s)
Le caractere le plus fréquent apparait 3 fois
Le caractere le plus fréquent dans le fichier est : o
Segmentation fault
$