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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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

  2. #2
    Membre éclairé 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
    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 !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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
    Membre éclairé 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
    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

  5. #5
    Membre éclairé 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
    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;
    }

  6. #6
    Membre éclairé 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
    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();
    		.............

  7. #7
    Membre éclairé 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
    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

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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
    Membre éclairé 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
    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);
    }

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