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. #1
    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 probleme de compilation :remplissage de la table de hachage
    bonjour à tous,
    j'ai un probleme de plantage dans la focntion qui consiste à remplir la table de hachage par les mots lus à partir d'un fichier texte
    voila la fonction
    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
    int LireFichierEntree(char const *langue, TableHachageMot DblTableHash[], int *pNbLignes)
    {
    	int retour = -1;
    	FILE *fdesc = NULL;
    	if(pNbLignes != NULL)
    		*pNbLignes = 0;
    	fdesc = ouvrir_fichier_entree(langue);
    	if ( fdesc==NULL )
    	{
    		perror("fopen");
    	}
    	else
    	{
     
    		int ancienneLigne = -1;
    		int ancienneColonne = -1;
    		int ligne = 0;
    		int colonne = -1;
    		ssize_t res;
    		char* buff = NULL;
    		size_t tailleBuff = 0;
     
     
     
    		printf("Lecture du fichier texte (prog: 1 point pour %d lignes)...\n", PROG_NBLIGNES);
    		while ( (res=get_word(fdesc, &buff, &tailleBuff, &ligne, &colonne))>0 )
    		{
    			if(ancienneLigne == ligne)
    			{
    				static char const separ[] = {SEPARATEUR, '\0'};
     
     
     
     
    				#if 0
    				AfficherEspaces(ancienneColonne);
     
    				puts(res);
    				#endif
    				InsertionDoubleHashEx(DblTableHash, res, 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.*/
     
    		}/*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(res),free(buff), buff=NULL, tailleBuff=0;
     
    		fclose(fdesc), fdesc=NULL;
    	}/*if fdesc*/
    	return retour;
    }
    des idées svp?
    merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  2. #2
    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
    voilà j'ai vu où est le probleme mais j'arrive pas à le resoudre:
    res=get_word(fdesc, &buff, &tailleBuff, &ligne, &colonne))>0 , la fonction get_word renvoie la longuer du mot lu par contre faut stocker le mot et non pas sa longuer dans la table de hachage.
    une incompatibilité de type !
    Le jour est le père du labeur et la nuit est la mère des pensées.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    get_word retourne le mot dans buff...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    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
    Citation Envoyé par Médinoc Voir le message
    get_word retourne le mot dans buff...
    ah d'accord , ca veut dire dans ce cas (insertion des mots), je vais inserer le contenu de buff dans la table?
    MErci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  5. #5
    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
    ca plante dans ce cas apres ces modifications
    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
    Fonction de lecture principale, remplit la table de hachage de mots.*/
    int LireFichierEntree(char const *langue, TableHachageMot DblTableHash[], 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 )
    		{
    		    printf(buff);
    			if(ancienneLigne == ligne)
    			{
    				static char const separ[] = {SEPARATEUR, '\0'};
     
    				/* Mot sur la même ligne: Ajouter 2seq */
     
    				InsertionDoubleHashEx(DblTableHash, buff, 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;
    }
    Le jour est le père du labeur et la nuit est la mère des pensées.

  6. #6
    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, là à ce niveau j'ai rempli la table avec les mots du texte, me reste la creation des 2 séq (2mots) à partir des mots
    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
    int TraiterFichier(char const *langue, double supportMin, int *pNbLignes, int *pMaxSequence)
    {
    	int iSeq;
    	int bEnregistrementOK = 1;
    	int nbLignes = 0;
    	TableHachageMot *DblTableHash;
    	struct Chainon_fbtAllocator *pAlloc2seq = Chainon_CreateFbtAllocator(1000000);
    	struct Coord_fbtAllocator *pAllocCoord2seq = Coord_CreateFbtAllocator(1000000);
     
    	AfficherCarac(stdout, 79, '-');
    	printf("\nTraitement fichier pour langue : %s\n", langue);
     
    	if(pNbLignes != NULL)
    		*pNbLignes = 0;
    	if(pMaxSequence != NULL)
    		*pMaxSequence = 0;
     
    	DblTableHash = CreerDoubleTableHachage();
    	SetAllocateurChainon(Chainon_FbtAllocToIface(pAlloc2seq));
    	SetAllocateurCoord(Coord_FbtAllocToIface(pAllocCoord2seq));
    	if(LireFichierEntree(langue, DblTableHash, &nbLignes)<0)
    		return EXIT_FAILURE;
    	/*EnregistrerTableCompleteFichBinaire(TableHash, langue, 2);*/
     
    	{
    		size_t *pStats = NULL;
    		size_t nStats = 0;
    		if(statistiques_double_table(DblTableHash, &pStats, &nStats)>=0)
    		{
    			#if 0
    			size_t iStat;
    			#endif
    			printf("--- Statistiques de la table de hachage ---\n");
    			while(nStats>0 && pStats[nStats-1]==0)
    				nStats--;
    			printf("Nb. de cases vides        : %llu\n", (long long)pStats[0]);
    			printf("Nb. maximum de collisions : %llu\n", (long long)nStats);
    			#if 0
    			for(iStat=0 ; iStat<nStats ; iStat++)
    			{
    				if(pStats[iStat]!=0)
    					printf("%llu : %llu\n", (long long)iStat, (long long)(pStats[iStat]));
    			}
    			#endif
    			putchar('\n');
    		}
    		free(pStats), pStats=NULL;
    	}
     
    	if(pNbLignes != NULL)
    		*pNbLignes = nbLignes;
     
    	printf("Calcul des nombres de lignes...\n");
    	CalculerNombreLignesDoubleTable(DblTableHash);
     
    	SetAllocateurChainon(Chainon_GetFbtCrtAllocator());
    	SetAllocateurCoord(Coord_GetFbtCrtAllocator());
     
     
    	for(iSeq=2 ; taille_double_table(DblTableHash)!=0 ; iSeq++)
    	{
    		TableHachageMot *DblTableHashNseq = CreerDoubleTableHachage();
    		.............
    Le jour est le père du labeur et la nuit est la mère des pensées.

  7. #7
    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,
    Là vraiement j'heiste entre creer les 2table de hachage qui contiennent des mots et puis creer la liste des 2 mots àpartir des mots. Ou bien lire le texte et puis creer 2table de hachage pour contenir les mots, ensuite relire le texte pour extraire les 2 mots?
    Sachant que le fichier texte est gigantesque.

    Une idée svp?
    merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je conseille d'utiliser une table de hachage pour les mots et une autre pour les 2mots, et générer les deux en même temps lors de la lecture du fichier texte.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    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
    Citation Envoyé par Médinoc Voir le message
    Je conseille d'utiliser une table de hachage pour les mots et une autre pour les 2mots, et générer les deux en même temps lors de la lecture du fichier texte.
    Bonjour Médinoc, j'avais hier un souci avec mon PC ce qui ma empeché de continuer le travail.
    bref voila le bout de code de la fonction qui remplit la table de hachage avec la liste des 2sequence. Là je bloque comment faire integrer la fonction qui remplit les mots.
    est ce que je fais un appel de la fonctio à l'interieur de celle là?
    Merci
    cordialement Cyrine
    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
    int TraiterFichier(char const *langue, int *pNbLignes)
    {
     
    	int bEnregistrementOK = 1;
    	int nbLignes = 0;
    	TableHachageMot *DblTableHash;
    	struct Chainon_fbtAllocator *pAlloc2seq = Chainon_CreateFbtAllocator(1000000);
    	struct Coord_fbtAllocator *pAllocCoord2seq = Coord_CreateFbtAllocator(1000000);
     
    	AfficherCarac(stdout, 79, '-');
    	printf("\nTraitement fichier pour langue : %s\n", langue);
     
    	if(pNbLignes != NULL)
    		*pNbLignes = 0;
    	if(pMaxSequence != NULL)
    		*pMaxSequence = 0;
     
    	DblTableHash = CreerDoubleTableHachage();
    	SetAllocateurChainon(Chainon_FbtAllocToIface(pAlloc2seq));
    	SetAllocateurCoord(Coord_FbtAllocToIface(pAllocCoord2seq));
    	if(LireFichierEntree(langue, DblTableHash, &nbLignes)<0)
    		return EXIT_FAILURE;
    	/*EnregistrerTableCompleteFichBinaire(TableHash, langue, 2);*/
     
    	{
    		size_t *pStats = NULL;
    		size_t nStats = 0;
    		if(statistiques_double_table(DblTableHash, &pStats, &nStats)>=0)
    		{
    			#if 0
    			size_t iStat;
    			#endif
    			printf("--- Statistiques de la table de hachage ---\n");
    			while(nStats>0 && pStats[nStats-1]==0)
    				nStats--;
    			printf("Nb. de cases vides        : %llu\n", (long long)pStats[0]);
    			printf("Nb. maximum de collisions : %llu\n", (long long)nStats);
    			#if 0
    			for(iStat=0 ; iStat<nStats ; iStat++)
    			{
    				if(pStats[iStat]!=0)
    					printf("%llu : %llu\n", (long long)iStat, (long long)(pStats[iStat]));
    			}
    			#endif
    			putchar('\n');
    		}
    		free(pStats), pStats=NULL;
    	}
     
     
    	return (bEnregistrementOK ? EXIT_SUCCESS : EXIT_FAILURE);
    }
    Le jour est le père du labeur et la nuit est la mère des pensées.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Qu'appelles-tu "la fonction qui remplit les mots" ? LireFichierEntree() ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    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
    Citation Envoyé par Médinoc Voir le message
    Qu'appelles-tu "la fonction qui remplit les mots" ? LireFichierEntree() ?
    Oui lautre fois , la fonction LireFichierEntree() remplit la table avec la liste des 2 seq, donc cette fois ci on l'utilise 2 fois: une fois pour remplir les liste des 2 seq et uneautre pour remplir les mots
    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
    int LireFichierEntree(char const *langue, TableHachageMot DblTableHash[], 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 )
    		{
    			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, 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;
    }
    Le jour est le père du labeur et la nuit est la mère des pensées.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce que je te conseille, c'est modifier directement cette fonction pour remplir les mots en même temps...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    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
    Citation Envoyé par Médinoc Voir le message
    Ce que je te conseille, c'est modifier directement cette fonction pour remplir les mots en même temps...
    Dans cette meme fonction?
    Le jour est le père du labeur et la nuit est la mère des pensées.

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ben oui.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    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 pense là qu'il faut creer avant une 2eme table de hachage pour contenir la liste des mots
    de cette façon?
    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
    int TraiterFichier(char const *langue, int *pNbLignes)
    {
     
    	int bEnregistrementOK = 1;
    	int nbLignes = 0;
    	TableHachageMot *DblTableHash;
    	TableHachageMot *DblTableHash2;
    	struct Chainon_fbtAllocator *pAlloc2seq = Chainon_CreateFbtAllocator(1000000);
    	struct Coord_fbtAllocator *pAllocCoord2seq = Coord_CreateFbtAllocator(1000000);
     
    	AfficherCarac(stdout, 79, '-');
    	printf("\nTraitement fichier pour langue : %s\n", langue);
     
    	if(pNbLignes != NULL)
    		*pNbLignes = 0;
     
     
    	DblTableHash = CreerDoubleTableHachage();
    	DblTableHash2 = CreerDoubleTableHachage();
    	SetAllocateurChainon(Chainon_FbtAllocToIface(pAlloc2seq));
    	SetAllocateurCoord(Coord_FbtAllocToIface(pAllocCoord2seq));
    	if(LireFichierEntree(langue, DblTableHash,DblTableHash, &nbLignes)<0)
    		return EXIT_FAILURE;
    	/*EnregistrerTableCompleteFichBinaire(TableHash, langue, 2);*/
     
    	{
    		size_t *pStats = NULL;
    		size_t nStats = 0;
    		if(statistiques_double_table(DblTableHash, &pStats, &nStats)>=0)
    		{
    			#if 0
    			size_t iStat;
    			#endif
    			printf("--- Statistiques de la table de hachage ---\n");
    			while(nStats>0 && pStats[nStats-1]==0)
    				nStats--;
    			printf("Nb. de cases vides        : %llu\n", (long long)pStats[0]);
    			printf("Nb. maximum de collisions : %llu\n", (long long)nStats);
    			#if 0
    			for(iStat=0 ; iStat<nStats ; iStat++)
    			{
    				if(pStats[iStat]!=0)
    					printf("%llu : %llu\n", (long long)iStat, (long long)(pStats[iStat]));
    			}
    			#endif
    			putchar('\n');
    		}
    		free(pStats), pStats=NULL;
    	}
     
    	if(pNbLignes != NULL)
    		*pNbLignes = nbLignes;
     
    	printf("Calcul des nombres de lignes...\n");
    	CalculerNombreLignesDoubleTable(DblTableHash);
    	/*printf("La table de hachage avant le filtrage:\n");
    	dump_table(TableHash);*/
     
    	return (bEnregistrementOK ? EXIT_SUCCESS : EXIT_FAILURE);
    }
    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
    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 )
    		{
    			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, concat, ancienneLigne, ancienneColonne);
    				InsertionDoubleHashEx(DblTableHash2, buff, 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;
    }
    Le jour est le père du labeur et la nuit est la mère des pensées.

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Sauf que pour les mots seuls, une double n'est pas forcément nécessaire cette fois-ci, une simple devrait pouvoir suffire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    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
    Citation Envoyé par Médinoc Voir le message
    Sauf que pour les mots seuls, une double n'est pas forcément nécessaire cette fois-ci, une simple devrait pouvoir suffire.
    Merci Medinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct Chainon_fbtAllocator *pAlloc2seq = Chainon_CreateFbtAllocator(1000000);
    	struct Coord_fbtAllocator *pAllocCoord2seq = Coord_CreateFbtAllocator(1000000);
    ces deux lignes je touche pas? car je vois leurs utilité ici
    MErci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Vire-les, et vire aussi les SetAllocateurXxx().

    C'était une optimisation sur le mauvais truc, de toute façon.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    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
    Citation Envoyé par Médinoc Voir le message
    Vire-les, et vire aussi les SetAllocateurXxx().

    C'était une optimisation sur le mauvais truc, de toute façon.
    Quand je les vire, il m'affiche une erreur de segmentation.
    Donc je les laisse c'est mieux
    Le jour est le père du labeur et la nuit est la mère des pensées.

  20. #20
    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
    Ya un probleme concernant la génération du fichier texte contenant les mots.
    LE fichier n'est pas généré
    Une idée svp?
    merci
    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
    Retour: Comme le main() */
    int TraiterFichier(char const *langue, int *pNbLignes)
    {
     
    	int bEnregistrementOK = 1;
    	int nbLignes = 0;
    	TableHachageMot *DblTableHash;
    	TableHachageMot *DblTableHash2;
    	struct Chainon_fbtAllocator *pAlloc2seq = Chainon_CreateFbtAllocator(1000000);
    	struct Coord_fbtAllocator *pAllocCoord2seq = Coord_CreateFbtAllocator(1000000);
     
    	AfficherCarac(stdout, 79, '-');
    	printf("\nTraitement fichier pour langue : %s\n", langue);
     
    	if(pNbLignes != NULL)
    		*pNbLignes = 0;
     
     
    	DblTableHash = CreerDoubleTableHachage();
    	DblTableHash2 = CreerDoubleTableHachage();
    	SetAllocateurChainon(Chainon_FbtAllocToIface(pAlloc2seq));
    	SetAllocateurCoord(Coord_FbtAllocToIface(pAllocCoord2seq));
    	if(LireFichierEntree(langue, DblTableHash,DblTableHash, &nbLignes)<0)
    		return EXIT_FAILURE;
    	/*EnregistrerTableCompleteFichBinaire(TableHash, langue, 2);*/
     
    	{
    		size_t *pStats = NULL;
    		size_t nStats = 0;
    		if(statistiques_double_table(DblTableHash, &pStats, &nStats)>=0)
    		{
    			#if 0
    			size_t iStat;
    			#endif
    			printf("--- Statistiques de la table de hachage ---\n");
    			while(nStats>0 && pStats[nStats-1]==0)
    				nStats--;
    			printf("Nb. de cases vides        : %llu\n", (long long)pStats[0]);
    			printf("Nb. maximum de collisions : %llu\n", (long long)nStats);
    			#if 0
    			for(iStat=0 ; iStat<nStats ; iStat++)
    			{
    				if(pStats[iStat]!=0)
    					printf("%llu : %llu\n", (long long)iStat, (long long)(pStats[iStat]));
    			}
    			#endif
    			putchar('\n');
    		}
    		free(pStats), pStats=NULL;
    	}
     
    	if(pNbLignes != NULL)
    		*pNbLignes = nbLignes;
     
    	printf("Calcul des nombres de lignes...\n");
    	CalculerNombreLignesDoubleTable(DblTableHash);
    	/*printf("La table de hachage avant le filtrage:\n");
    	dump_table(TableHash);*/
     
     
    		int resSave;
    resSave = EnregistrerDoubleTableFichTexte(DblTableHash, langue);
    		printf("Resultat sortie : %d (%s).\n", resSave, (resSave>=0 ? "Succes" : "Echec"))
     
    	return (bEnregistrementOK ? EXIT_SUCCESS : EXIT_FAILURE);
    }
    Le jour est le père du labeur et la nuit est la mère des pensées.

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