Donc, on doit modifier la fonction r RechercherMot de telle sorte elle prend en entree l'index, non?
Version imprimable
Non, vu qu'on lui passe directement le tableau correspondant. Comme pour la fonction de tri.
Non, les seules fonctions callback, ce sont celles avec "callback" dans le nom.
Bonjour,
Code:
1
2
3
4
5
6 void RechercherMotTableau(tableauMotsCompact *TMC, char* ch) { unsigned int const idx = HachageCompletMot(ch); return RechercherMotC(ch, n, TMC[idx]) }
c'est comme ça?Code:
1
2
3
4 unsigned int HachageCompletMots(char const *mots) { return hash_chaine(mots); }
Plus ou moins:
PS: Décidément, tu l'aimes bien, ton "n"... Un jour il faudra m'expliquer d'où tu le sors...Code:
1
2
3
4
5
6
7
8
9
10 MotCompact* RechercherMotCompact(TableauMotsCompacts *TMC, char const* ch) { unsigned int const idx = HachageCompletMot(ch); return RechercherMot(TMC[idx].pMotsCompacts, TMC[idx].nbMotsCompact, ch); } MotCompact const* RechercherMotCompactC(TableauMotsCompacts const* TMC, char const* ch) { unsigned int const idx = HachageCompletMot(ch); return RechercherMotC(TMC[idx].pMotsCompacts, TMC[idx].nbMotsCompact, ch); }
j'ai encore une erreur de segmentation :aie:
je vois pas pourquoi? :?Code:
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 void GenererLesRegles2fr1en(FILE*pfOut, MotCompact const *pcLeft, MotCompact const *pcRight,MotCompact const pcMots3[],size_t n) { int sortie=0; double imc=0; size_t iLigneLeft = 0; size_t iLigneRight = 0; int const * pcCoordLeft = ligne_GetPremierC(pcLeft, &iLigneLeft); int const * pcCoordRight = ligne_GetPremierC(pcRight, &iLigneRight); while(pcCoordLeft!=NULL && (!sortie) && pcCoordRight!=NULL) { { int ligneRight = *pcCoordRight; while(pcCoordLeft!=NULL && (*pcCoordLeft)>ligneRight) pcCoordLeft = ligne_GetNextC(pcLeft, &iLigneLeft); } if(pcCoordLeft==NULL) break; { int ligneLeft = *pcCoordLeft; while(pcCoordRight!=NULL && (!sortie)&& ligneLeft<(*pcCoordRight)) pcCoordRight = ligne_GetNextC(pcRight, &iLigneRight); } if(pcCoordRight==NULL) break; if(*pcCoordLeft == *pcCoordRight) { char const*Left=GetMotCompact(pcLeft); char const*Right=GetMotCompact(pcRight); fprintf(pfOut,"%s",GetMotCompact(pcLeft)); fprintf(pfOut,"->"); fprintf(pfOut,"%s\n",GetMotCompact(pcRight)); imc=info_mut_cond(pcLeft,pcRight,pcMots3,n); fprintf(pfOut,"IMC = "); sortie=1; pcCoordLeft = ligne_GetNextC(pcLeft, &iLigneLeft); pcCoordRight = ligne_GetNextC(pcRight, &iLigneRight); } } }
une idée?
Merci
Bizarre cette erreur, là il affiche bien les 3 regles, mais à la fin il affiche cette erreur de segmentation :(:triste:
Pas d'idée, mais commence déjà par indenter correctement...
Code:
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 void GenererLesRegles2fr1en(FILE*pfOut, MotCompact const *pcLeft, MotCompact const *pcRight, MotCompact const pcMots3[], size_t n) { int sortie=0; double imc=0; size_t iLigneLeft = 0; size_t iLigneRight = 0; int const * pcCoordLeft = ligne_GetPremierC(pcLeft, &iLigneLeft); int const * pcCoordRight = ligne_GetPremierC(pcRight, &iLigneRight); while(pcCoordLeft!=NULL && (!sortie) && pcCoordRight!=NULL) { { int ligneRight = *pcCoordRight; while(pcCoordLeft!=NULL && (*pcCoordLeft)>ligneRight) pcCoordLeft = ligne_GetNextC(pcLeft, &iLigneLeft); } if(pcCoordLeft==NULL) break; { int ligneLeft = *pcCoordLeft; while(pcCoordRight!=NULL && (!sortie)&& ligneLeft<(*pcCoordRight)) pcCoordRight = ligne_GetNextC(pcRight, &iLigneRight); } if(pcCoordRight==NULL) break; if(*pcCoordLeft == *pcCoordRight) { char const*Left=GetMotCompact(pcLeft); char const*Right=GetMotCompact(pcRight); fprintf(pfOut,"%s",GetMotCompact(pcLeft)); fprintf(pfOut,"->"); fprintf(pfOut,"%s\n",GetMotCompact(pcRight)); imc=info_mut_cond(pcLeft,pcRight,pcMots3,n); fprintf(pfOut,"IMC = "); sortie=1; pcCoordLeft = ligne_GetNextC(pcLeft, &iLigneLeft); pcCoordRight = ligne_GetNextC(pcRight, &iLigneRight); } } }
Oui,
à la fin il s'arrete à ce niveauapres avoir traité tous les séquencesCode:while(pcCoordLeft!=NULL && (*pcCoordLeft)>ligneRight)
Je vois pas pourquoi cette erreur! elle me bloque vraiement là.
On a fait comme ca avec les regles 1mot1mot, et ca marchait nikel
Bizarre :s
Sans le code qui utilise pcMots3, pas évident de t'aider.
Surtout que là encore, je ne sais pas ce qu'est supposé signifier n...
le n pour dire TMC[idx].nbMotsCompact
:(
Sauf qu'à ma connaissance, quand tu appelles cette fonction, tu n'es pas encore supposée avoir un idx...
Mais tu n'es plus supposée appeler RechercherMotC() directement, depuis qu'on a écrit les fonctions RechercherMotCompact() et RechercherMotCompactC().
Cela me semblait évident...:roll:
le probleme persiste encore ..
iciConcernant MotCompact const pcMots3[], je l'utilise pour rechercher le mot EN dedansCode:while(pcCoordLeft!=NULL && (*pcCoordLeft)>ligneRight)
Poste le code complet de GenererLesRegles2fr1en() et info_mut_cond().
Et encore, je ne suis pas sûr de pouvoir t'aider même avec ça...
Ok, merci
Code:
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 void GenererLesRegles2fr1en(FILE*pfOut, MotCompact const *pcLeft, MotCompact const *pcRight, MotCompact const pcMots3[]) { int sortie=0; double imc=0; size_t iLigneLeft = 0; size_t iLigneRight = 0; int const * pcCoordLeft = ligne_GetPremierC(pcLeft, &iLigneLeft); int const * pcCoordRight = ligne_GetPremierC(pcRight, &iLigneRight); while(pcCoordLeft!=NULL && (!sortie) && pcCoordRight!=NULL) { { int ligneRight = *pcCoordRight; while(pcCoordLeft!=NULL && (*pcCoordLeft)>ligneRight) pcCoordLeft = ligne_GetNextC(pcLeft, &iLigneLeft); } if(pcCoordLeft==NULL) break; { int ligneLeft = *pcCoordLeft; while(pcCoordRight!=NULL && (!sortie)&& ligneLeft<(*pcCoordRight)) pcCoordRight = ligne_GetNextC(pcRight, &iLigneRight); } if(pcCoordRight==NULL) break; if(*pcCoordLeft == *pcCoordRight) { printf("%s",GetMotCompact(pcLeft)); printf("->"); printf("%s\n",GetMotCompact(pcRight)); imc=info_mut_cond(pcLeft,pcRight,pcMots3); printf("IM = "); printf("%e \n",imc); sortie=1; pcCoordLeft = ligne_GetNextC(pcLeft, &iLigneLeft); pcCoordRight = ligne_GetNextC(pcRight, &iLigneRight); } } }
Mais je pense pas que le souci vient de la 2eme fonction, car quand je la supprime, l'erreur persiste encore :sCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 double info_mut_cond(MotCompact const *pc, MotCompact const *pc2,MotCompact const pcMot[]) { double IM=0; char const * mot = GetMotCompact(pc); char * mot1 = malloc(sizeof (*mot1) * 256); char * mot2 = malloc(sizeof (*mot2) * 256); double p1,p2,p3,p4,p5; MotCompact const *m1; MotCompact const *m2; sscanf(mot, "%s %s", mot1, mot2); m1= RechercherMotCompactC( pcMot,mot1); m2= RechercherMotCompactC(pcMot,mot2); p1=(NbLignesCommunes(pc,pc2)/((double)596831)); IM=p1; return IM; }