IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

probleme de compilation :remplissage de la table de hachage


Sujet :

C

  1. #61
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Je pense qu'il ne faut pas faire ça.

    Pour les mots seuls, je ferais l'ajout dans la table AVANT le if.

  2. #62
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je pense qu'il ne faut pas faire ça.

    Pour les mots seuls, je ferais l'ajout dans la table AVANT le if.
    Tu es bien plus au courant que moi du détail du problème du posteur, alors je te crois sur parole.

  3. #63
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    @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.

  4. #64
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    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)

  5. #65
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Ah , oui de cette façon, ca marche
    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;
    }
    Médinoc

  6. #66
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    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;
    }
    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;
     
    }
    jusquà ce niveau le compilateur m'affiche une errreur :
    attention : passing argument 1 of ‘InitListe’ from incompatible pointer type|

    Aussi à ce niveau pour afficher le contenu de la table de hachage :
    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));
    		}
     
    }
    j'ai remarqué que le compteur i ne s'incrémente pas
    Une idée svp?
    Merci

  7. #67
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    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...

  8. #68
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    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

  9. #69
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    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.

  10. #70
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Oui Médinoc,
    je suis prête à ces modifications (jai pas le choix).
    Explique moi stp ces genre de modifications
    Amitiés

  11. #71
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Il faudrait un truc de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct DoubleTableHachage
    {
    	int bOnMetToutDansLePremier;
    	TableHachareMot simpleTables[TAILLEHASH];
    };
    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...

    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é.

  12. #72
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Oula ca devient trop compliqué
    Je vois pas trop l'utilité du champ : int bOnMetToutDansLePremier;
    ?

  13. #73
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Le probleme c'est dans l'ecriture des regles dans le fichier texte :
    dans le main j'ai fait ca :
    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);
    				}
    			}
    		}
    	}
    }
    }
    Ya 6 boucles imbriquées, on peut pas optimiser ça?
    JE suis perdue
    Une idée?
    Merci pour vos reponses

  14. #74
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Ben je ne vois pas trop comment, à part peut-être en changeant de conteneur: Faire un truc classé par lignes...

  15. #75
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    je vois pas comment tu as fais avec l'ancien projet, il est efficace en terme de temps

  16. #76
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    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).

  17. #77
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Oui, mais là tu me conseille de faire quoi?
    Je suis totalement bleue
    J'ai plus d'idée

  18. #78
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    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.

  19. #79
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    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

  20. #80
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    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);

Discussions similaires

  1. probleme lors de remplissage d'un table JTable
    Par foufoulina2007 dans le forum Composants
    Réponses: 7
    Dernier message: 02/11/2007, 18h13
  2. [JSP & TAGLIB] Probleme de compilation
    Par GesMo dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 17/05/2004, 15h03
  3. Probleme de Compilation de la STL
    Par stoluup dans le forum MFC
    Réponses: 3
    Dernier message: 05/05/2004, 17h25
  4. [TP]Probleme de compilation sous TP7
    Par yffick dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 18/12/2003, 20h32
  5. Problemes de compilation avec g++ sous linux
    Par Selimmel dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 19/09/2003, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo