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 :

erreur de segmentation


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 erreur de segmentation
    bonjour à tous,
    j'ai fait un programme qui extrait les paires des mots voisins du texte et les sttocke dans une table de hachage.
    ya une erreur de segmentation dont j'arrive pas à voir la cause.
    cette erreur est dans la fonction : void insere_table(Liste **TableHash, char mot[500])
    et avec printf ("vvvvvv"); (je la met pour voir où le probleme). je vois que le programme s'arrete meme avavnt d'affiche "vvvvvv":
    quelqu'un peut m'aider à rectifier cette erreur fatale
    voila le code
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>
    #define TAILLEHASH 307009
    #define BUFFSIZE 64
    #define FNAME "c:\\out.txt"
     
    typedef struct L
    {	int freq;
    	char mot[50];
     
    	struct L *suivant;
    } Liste;
     
     
     
    char* get_word(FILE *fdesc, char *buff, size_t size)
    {
    	char *ret=NULL;
     
    	if( fdesc!=NULL && buff!=NULL && size>0 )
    	{
    		int c;
    		int i=0;
    		while( ret==NULL && i<size && (c=fgetc(fdesc))!=EOF )
    		{
    			if( isalpha(c) )
    			{
    				buff[i]=c;
    				i++;
    			}
    			else if( i>0 )
    			{	/* mot */
    				buff[i]='\0';
    				ret=buff;
    			}
    		}
    	}
    	return ret;
    }
     
    void insere_table(Liste **TableHash,  char  mot[50]);
    unsigned int hash_cle(const char mot[50]);
     
     
    int main(void)
    {
    	FILE *fdesc=fopen(FNAME,"r");
    	Liste **TableHash;
     
    	if( fdesc )
    	{
    		char buff[BUFFSIZE];
            char prec[BUFFSIZE];
            char mot_res[BUFFSIZE*2];
     
     
     
     
    		if( get_word(fdesc,prec,BUFFSIZE) )
    		{
    			while( get_word(fdesc, buff, BUFFSIZE) )
    			{
    				//printf("%s %s\n",prec,buff);
    				sprintf(mot_res, "%s %s", buff, prec);
                    puts(mot_res);
     
     
     
     
     
    				insere_table(TableHash, mot_res);
    				strncpy( prec,buff,BUFFSIZE);
    			}
    		}
    		fclose(fdesc);
    	}
     
    	return 0;
    }
     
    void insere_table(Liste **TableHash,  char  mot[500])
    {
    	/* calcule le hash du mot */
    	unsigned int idx = hash_cle(mot);
    printf("%d", idx);
     
     
    	/* recherche du mot */
     
    	Liste *p = TableHash[idx];
    	printf("vvvtevvvvvvvvv");
    	while(p != NULL)
    	{
    	    printf("aaa");
    		if(strcmp(p->mot, mot) == 0)
    		{
    			/* le mot est trouve */
    			break;
    		}
    		p =p->suivant;
    	}
     
    	if(p == NULL)
    	{
    		/* le mot n'existe pas, insertion de celui ci */
    		p = (Liste *)malloc(sizeof(Liste));
    		if(p == NULL)
    		{
    			/* erreur d'allocation de memoire */
    			printf("Erreur d'allocation mémoire\n");
    			exit(0);
    		}
     
    		/* initialisation de la structure */
     
    		p->freq = 1;
    		strncpy(p->mot, mot, sizeof(p->mot));
     
     
     
    		/* mise a jour des liens, insertion en debut de liste */
    		p->suivant = TableHash[idx];
    		TableHash[idx] = p;
     
    		return;
    	}
     
    	/* le mot existe */
    	/* ajout des coordonnees */
     
    }
     
    unsigned int hash_cle(const char mot[500])
    {
    	unsigned int val = 0;
    	for(; *mot != '\0'; ++mot)
    	{
    		val = *mot + 31 * val;
    	}
    	return val % TAILLEHASH;
    }

    merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    Le pointeur TableHash est utilisé sans être initialisé.

  3. #3
    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 à tous ,
    j'ai un probleme dans ma fonction "GenererNseq" c'est qu'il ya une erreur de segmentation
    j'ai une liste chainéé seq 2 et une autre autre liste seq2, je fais le parcours de ces 2 liste et voir si le dernier mot de seq==au 1er mot de seq, si c'est le cas , je concatene les 2 mots et le stocke dans une nouvelle liste chainée
    merci de m'aider
    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
    void GenererNseq(Liste **seq, Liste **seq2)
    {
        char *der;
        char *pre;
        char *buff;
        Liste *ss;
        Liste *p;
        Liste *q;
        char *mot;
        mot=p->mot;
        der =NULL;
        der = malloc(100*sizeof(*der));
     
     
     
     
     
     
        for(p=*seq; p!=NULL; p=p->suivant)
        {
            der=GetLastWord(buff,mot);
     
                printf("%s", der);
     
        }
        free(der);
     
     
    }
     
     
     
     
     
    char* GetFirstWord(char* sentence, char* buffer)
    {
      char* pch;
     
      strcpy(buffer, sentence);
     
      pch = strtok(buffer," ,.-");
      if (pch == NULL)
      {
        buffer[0] = 0;
        pch = buffer;
      }
      return pch;
    }
     
    char* GetLastWord(char* sentence, char* buffer)
    {
      char* res;
      char* pch;
     
      strcpy(buffer, sentence);
     
      res = NULL;
      pch = strtok(buffer," ,.-");
      while (pch != NULL)
      {
        res = pch;
        pch = strtok (NULL, " ,.-");
      }
     
      if (res == NULL)
      {
        buffer[0] = 0;
        res = buffer;
      }
      return res;
    }
     
    }

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Liste *p;
        Liste *q;
        char *mot;
        mot=p->mot;
    p n'est pas initialisé.

    Mais ça va encore planté plus loin
    Puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     der=GetLastWord(buff,mot);
    Et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* GetLastWord(char* sentence, char* buffer)
    {
      char* res;
      char* pch;
     
      strcpy(buffer, sentence);
    Ici, sentence est invalide.

    En plus, j'ai l'impression que t'a inversé les deux paramètres entre l'appel et l'implémentation.

  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
    Merci beaucoup 3Darchi, mais comment je peux initialiste p et buff?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Je te l'avais bien dit, ta façon de créer une liste chaînée génère trop de confusion...
    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.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    J'ai l'impression que:
    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
     
    #define C_TAILLE_MAX_PHRASE 100
    void GenererNseq(Liste **seq, Liste **seq2)
    {
        char *buff;
        char *der;
        Liste *p;
        char *mot; 
        buff = malloc(C_TAILLE_MAX_PHRASE*sizeof(*buff));
        for(p=*seq; p!=NULL; p=p->suivant)
        {
            mot=p->mot;
            der=GetLastWord(buff,mot); 
        }
        free(buff);
    }
    Puis dans GetLastWord: strncpy(buffer, sentence,C_TAILLE_MAX_PHRASE);
    Éventuellement: gérer avec erreur le cas où strlen(sentence)>C_TAILLE_MAX_PHRASE. Ou utiliser une allocation dynamique de buffer en fonction de la taille de mot, etc...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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