Je pense qu'il ne faut pas faire ça.
Pour les mots seuls, je ferais l'ajout dans la table AVANT le if.
Je pense qu'il ne faut pas faire ça.
Pour les mots seuls, je ferais l'ajout dans la table AVANT le if.
@diogene: Pour faire simple: La fonction servait à lister les couples de mots se suivant (sur la même ligne, donc). Maintenant, cyrine veut aussi les mots seuls, donc pour eux pas besoin de vérifier s'il s'agit d'un couple valide.
MErci,
Là il insere le Mot, mais il n'insere pas correctement les nombre de lignes où il apparait: il insere -1, 0, 1 au lieu de 0,1,2 (ligne0, ligne1, ligne2)
Ah , oui de cette façon, ca marche
Médinoc
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 int LireFichierEntree(char const *langue, TableHachageMot DblTableHash[],TableHachageMot DblTableHash2[],int *pNbLignes) { int retour = -1; FILE *fdesc = NULL; if(pNbLignes != NULL) *pNbLignes = 0; fdesc = ouvrir_fichier_entree(langue); if ( fdesc==NULL ) { perror("fopen"); } else { char* buff = NULL; char* prec = NULL; char* concat = NULL; size_t tailleBuff = 0; size_t taillePrec = 0; size_t tailleConcat = 0; int ancienneLigne =-1 ; int ancienneColonne = -1; int ligne = 0; int colonne = -1; ssize_t res; printf("Lecture du fichier texte (prog: 1 point pour %d lignes)...\n", PROG_NBLIGNES); while ( (res=get_word(fdesc, &buff, &tailleBuff, &ligne, &colonne))>0 ) { InsertionDoubleHashEx(DblTableHash, buff, ligne, ancienneColonne); if(ancienneLigne == ligne) { static char const separ[] = {SEPARATEUR, '\0'}; /* Mot sur la même ligne: Ajouter 2seq */ if(tailleConcat < 2*tailleBuff) { tailleConcat = 2*tailleBuff; ReallocCharExit(&concat, tailleConcat); } assert(concat != NULL); strcpyN(concat, tailleConcat, prec); strcatN(concat, tailleConcat, separ); strcatN(concat, tailleConcat, buff); #if 0 AfficherEspaces(ancienneColonne); puts(concat); #endif //InsertionDoubleHashEx(DblTableHash, buff, ancienneLigne, ancienneColonne); InsertionDoubleHashEx(DblTableHash2, concat, ancienneLigne, ancienneColonne); } else { if(ligne%PROG_NBLIGNES==0) putchar('.'); } /* Mémorise l'ancien mot et son n° de ligne */ ancienneLigne = ligne; ancienneColonne = colonne; /* Pour de meilleures performances, on bosse en double buffer plutot que recopier à chaque fois.*/ if(taillePrec != tailleBuff) { taillePrec = tailleBuff; ReallocCharExit(&prec, taillePrec); } assert(prec != NULL); assert(taillePrec == tailleBuff); SwapPtrChar(&prec, &buff); }/*while*/ if(res < 0) perror("get_word"); else { retour = 0; /* OK */ putchar('\n'); printf("Lu %d lignes.\n", ligne); if(pNbLignes != NULL) *pNbLignes = ligne; } /* Nettoyage */ free(concat), concat=NULL, tailleConcat=0; free(prec), prec=NULL, taillePrec=0; free(buff), buff=NULL, tailleBuff=0; fclose(fdesc), fdesc=NULL; }/*if fdesc*/ return retour; }
Bonsoir (re)
Là j'ai terminé complètement l'implémentation du prograamme, mais j'ai remarqué qu'il est super lent au niveau de la generation des regles 1mot-1mot
Bref, donc j'ai décidé de changer un peu le code de telle façon j'utilise plus la double table de hachage, mais une table de hachage simple (comme ma conseillé d'ailleurs Médinoc)
VOilà les transformations faites :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 TableHachageMot * CreerTableHachage() { TableHachageMot * DblTableHash = AllocExit(TAILLEHASH * sizeof *DblTableHash); size_t i; for(i=0 ; i<TAILLEHASH ; i++) { InitListe(&DblTableHash[i]); } return DblTableHash; }jusquà ce niveau le compilateur m'affiche une errreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void NOM_FONCTION(InitListe)(TYPE_LISTE *L) { L->NOM_PREMIER = NULL; }
attention : passing argument 1 of ‘InitListe’ from incompatible pointer type|
Aussi à ce niveau pour afficher le contenu de la table de hachage :j'ai remarqué que le compteur i ne s'incrémente pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 FILE *pfOut = fopen("mot.txt", "w"); for(i=0 ; i<TAILLEHASH ; i++) { for(pc=GetPremierC(&DblTableHash1fr[i]) ; pc!=NULL ; pc=GetNextC(pc)) { fprintf(pfOut,"%s \n ",GetMot(pc)); } }
Une idée svp?
Merci
Le problème, c'est que si tu n'utilises pas une double-table de hachage pour les mots simples, tu ne peux plus les comparer aux mots doubles!
Le fait d'utiliser une double-table pour les deux avait pour but la compatibilité entre la table de mots simples et la table de mots doubles...
Merci Médinoc,
MAis mon directeur ma dit de refaire l'implementation de mon programme car il le trouve trop lent: 4 jours d'execution et il na pas terminé la moitié du traitement
C'est vrai que la table de hachage double peut causer des problèmes de performances dus au cache et à la perte de localité. Il y aurait un moyen de contourner cela, mais ça impliquerait de modifier le format des tables doubles.
Oui Médinoc,
je suis prête à ces modifications (jai pas le choix).
Explique moi stp ces genre de modifications
Amitiés
Il faudrait un truc de ce genre:
Et modifier le code pour ne faire les parcours et insertions que sur la première table si bOnMetToutDansLePremier est non-nul. Et aussi, pour utiliser la structure au lieu de directement un tableau de TableHachageMot...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 struct DoubleTableHachage { int bOnMetToutDansLePremier; TableHachareMot simpleTables[TAILLEHASH]; };
Au niveau mémoire, ça bouffera quand même la place d'une table complète, mais ça n'aura pas les mêmes soucis de cache ou de localité.
Oula ca devient trop compliqué
Je vois pas trop l'utilité du champ : int bOnMetToutDansLePremier;
?
Le probleme c'est dans l'ecriture des regles dans le fichier texte :
dans le main j'ai fait ca :
Ya 6 boucles imbriquées, on peut pas optimiser ça?
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 FILE *pfOut = fopen("triggers2-1.txt", "w"); for(i=0 ; i<TAILLEHASH ; i++) { for(j=0 ; j<TAILLEHASH ; j++) { for(pc=GetPremierC(&DblTableHash2fr[i][j]) ; pc!=NULL ; pc=GetNextC(pc)) { for(k=0 ; k<TAILLEHASH ; k++) { for(l=0 ; l<TAILLEHASH ; l++) { for(pc2=GetPremierC(&DblTableHash1en[k][l]) ; pc2!=NULL ; pc2=GetNextC(pc2)) { TraiterCoupleMots1(pc, pc2,pfOut,nbLignes1,DblTableHash2fr,DblTableHash1en,DblTableHash1fr); } } } } } }
JE suis perdue
Une idée?
Merci pour vos reponses
Ben je ne vois pas trop comment, à part peut-être en changeant de conteneur: Faire un truc classé par lignes...
je vois pas comment tu as fais avec l'ancien projet, il est efficace en terme de temps
Dans l'ancien projet, on avait des soucis de mémoire, alors j'avais converti toutes les listes chaînées en tableaux ne contenant que ce qu'il nous fallait, souviens-toi.
Là, question localité, on était impeccables. Mais ça n'est faisable qu'une fois qu'on n'a plus rien à modifier. (de plus, j'étais passé par des fichiers binaires pour faire la conversion).
Oui, mais là tu me conseille de faire quoi?
Je suis totalement bleue
J'ai plus d'idée
Ben on pourrait faire aussi un truc de ce genre une fois qu'on n'a plus à modifier la liste, mais j'ai peur que ce soit trop compliqué pour ton niveau. Surtout si on ne passe pas par des fichiers comme l'autre fois...
Au passage, oublie l'histoire du classement par lignes: C'est inapproprié pour trouver le nombre de lignes communes.
Bonjour ,
est ce que c'est possible de faire une fonction qui ne prends aucun parametre?
int TraiterRegles()
dans l'ancien projet : int TraiterRegles(char const *langue1, char const *langue2, int nbLignes, int maxSequence1, int maxSequence2, double confianceMin, int m)
car dans mon cas je traite pas la langue en tant que parametre
MErci
Oui il n'y a pas de problème
Le seul truc c'est que si ta fonction ne prend aucun paramètre, il faut mettre void
Code : Sélectionner tout - Visualiser dans une fenêtre à part int TraiterRegles(void);
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager