bonjour à tous,
j'ai fait un programme qui extrait les paires des mots voisins du texte et les sttocke dans une table de hachage.
ya une erreur de segmentation dont j'arrive pas à voir la cause.
cette erreur est dans la fonction : void insere_table(Liste **TableHash, char mot[500])
et avec printf ("vvvvvv"); (je la met pour voir où le probleme). je vois que le programme s'arrete meme avavnt d'affiche "vvvvvv":
quelqu'un peut m'aider à rectifier cette erreur fatale
voila le code
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
136
137
138
139
140
141
142
143
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define TAILLEHASH 307009
#define BUFFSIZE 64
#define FNAME "c:\\out.txt"
 
typedef struct L
{	int freq;
	char mot[50];
 
	struct L *suivant;
} Liste;
 
 
 
char* get_word(FILE *fdesc, char *buff, size_t size)
{
	char *ret=NULL;
 
	if( fdesc!=NULL && buff!=NULL && size>0 )
	{
		int c;
		int i=0;
		while( ret==NULL && i<size && (c=fgetc(fdesc))!=EOF )
		{
			if( isalpha(c) )
			{
				buff[i]=c;
				i++;
			}
			else if( i>0 )
			{	/* mot */
				buff[i]='\0';
				ret=buff;
			}
		}
	}
	return ret;
}
 
void insere_table(Liste **TableHash,  char  mot[50]);
unsigned int hash_cle(const char mot[50]);
 
 
int main(void)
{
	FILE *fdesc=fopen(FNAME,"r");
	Liste **TableHash;
 
	if( fdesc )
	{
		char buff[BUFFSIZE];
        char prec[BUFFSIZE];
        char mot_res[BUFFSIZE*2];
 
 
 
 
		if( get_word(fdesc,prec,BUFFSIZE) )
		{
			while( get_word(fdesc, buff, BUFFSIZE) )
			{
				//printf("%s %s\n",prec,buff);
				sprintf(mot_res, "%s %s", buff, prec);
                puts(mot_res);
 
 
 
 
 
				insere_table(TableHash, mot_res);
				strncpy( prec,buff,BUFFSIZE);
			}
		}
		fclose(fdesc);
	}
 
	return 0;
}
 
void insere_table(Liste **TableHash,  char  mot[500])
{
	/* calcule le hash du mot */
	unsigned int idx = hash_cle(mot);
printf("%d", idx);
 
 
	/* recherche du mot */
 
	Liste *p = TableHash[idx];
	printf("vvvtevvvvvvvvv");
	while(p != NULL)
	{
	    printf("aaa");
		if(strcmp(p->mot, mot) == 0)
		{
			/* le mot est trouve */
			break;
		}
		p =p->suivant;
	}
 
	if(p == NULL)
	{
		/* le mot n'existe pas, insertion de celui ci */
		p = (Liste *)malloc(sizeof(Liste));
		if(p == NULL)
		{
			/* erreur d'allocation de memoire */
			printf("Erreur d'allocation mémoire\n");
			exit(0);
		}
 
		/* initialisation de la structure */
 
		p->freq = 1;
		strncpy(p->mot, mot, sizeof(p->mot));
 
 
 
		/* mise a jour des liens, insertion en debut de liste */
		p->suivant = TableHash[idx];
		TableHash[idx] = p;
 
		return;
	}
 
	/* le mot existe */
	/* ajout des coordonnees */
 
}
 
unsigned int hash_cle(const char mot[500])
{
	unsigned int val = 0;
	for(; *mot != '\0'; ++mot)
	{
		val = *mot + 31 * val;
	}
	return val % TAILLEHASH;
}

merci