[C ]erreur de segmentation dans une fonction

stroumpf Messages postés 292 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,j"ai un probleme dans ma focntion :
l'idée de base c'est que j'ai une liste chainée seq2 et une autre seq , je vais parcourir les 2 tout en faisant la comparaison pour chaque element de la liste si le dernier mot =au 1er .
si c'est le cas je vais creer un nouvelle liste qui va contenir la concatenation des 2 mots (des 2 liste).
voila le code :
/* permettra d'utiliser partout la meme valeur:*/
#define C_TAILLE_MOT 50
typedef struct L
{
	int freq;
	char mot[C_TAILLE_MOT];
 
	struct L *suivant;
} Liste;
 
/* Prototypes des fonctions pour que ce soit plus clair */
/* Assymetrie dans les arguments pour montrer que le premier,
est const et on y touche pas alors que le second est le buffer temporaire
*/
char* GetFirstWord(const char* sentence, char* buffer);
char* GetLastWord(const char* sentence, char* buffer);
 
Liste * GenNseq(Liste *seq2, Liste *seq);
 
Liste * GenNseq(Liste *seq2, Liste *seq)
{
   Liste *p;
   Liste *q;
   char * mot;
   char * mot1;
   char *first;
   char *last;
   char buff1[C_TAILLE_MOT];/* pas besoin de malloc car 50 est une petite taille et ca s'ajuste avec Liste::mot */
   char buff2[C_TAILLE_MOT];/* deux buffer temporaire: un pour chaque liste!*/
   Liste *pNouvelleListe;/* pour creer la liste*/
   Liste *pCourant;
 
   pNouvelleListe=NULL;
   for(p=seq2; p!=NULL; p=p->suivant)
   {
      mot=p->mot;
      if(mot){
         first=GetFirstWord(mot, buff1);
         for(q=seq; q!=NULL; q=q->suivant)
         {
            mot1 =q->mot;
            if(mot1){
               last=GetLastWord(mot1, buff2);
               if(strncmp(first, last,C_TAILLE_MOT)==0)
               { 
                  printf("similaires!!!!");
                  pCourant = malloc(sizeof(Liste));
                  pCourant->freq = 1;
                  strncpy(pCourant->mot,first,C_TAILLE_MOT);
                  pCourant->suivant = pNouvelleListe;
                  pNouvelleListe = pCourant;
               }
            }
         }
      }
   }
 
   return pNouvelleListe;
}
 
char* GetFirstWord(const char* sentence, char* buffer)
{
  char* pch;
 
  strncpy(buffer, sentence,C_TAILLE_MOT);
 
  pch = strtok(buffer," ,.-");
  /* si (pch==NULL) ca veut dire que le premier mot est le total de sentence */
  return buffer;
}
 
char* GetLastWord(const char* sentence, char* buffer)
{
  char* res;
  char* pch;
 
  strncpy(buffer, sentence,C_TAILLE_MOT);
 
  res = NULL;
  pch = strtok(buffer," ,.-");
  while (pch != NULL)
  {
    res = pch;
    pch = strtok (NULL, " ,.-");
  }
 
  if (res == NULL)
  {/* C'est qu'on n'est pas rentre dans la boucle while -> donc le premier mot = l'ensemble de sentence */
    res = buffer;
  }
  return res;
}
 

merci à vous
j'attends vos reponses
Configuration: Windows Vista
Internet Explorer 7.0

47 réponses

  • 1
  • 2
  • 3
Résumé de la discussion

Le sujet porte sur l’implémentation d’une fonction GenNseq parcourant deux listes chaînées et créant une nouvelle liste par concaténation lorsque le premier mot d’une entrée de seq2 correspond au dernier mot d’une entrée de seq. Des éléments récurrents discutés incluent l’identification du premier et du dernier mot via GetFirstWord et GetLastWord, la comparaison par chaîne et la construction itérative de pNouvelleListe. Plusieurs réponses proposent de stabiliser le prototype en passant seq comme tableau de listes et en stockant les résultats dans seq[i+1], plutôt que d’écraser seq existantes. En cas d’allocations mémoire et de gestion de tailles, il est recommandé d’éviter les copies inutiles et de vérifier les nullités avant d’accéder aux champs mot.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. beslae Messages postés 109 Date d'inscription   Statut Membre 16
     
    Excuse moi stroumpf, je sais que c est dure d etre tout bleu, tout petit, et d'etre sur qu on sé bien exprimer alors que c est vraiment pas le KKAAAAA !
    "
    si le dernier mot =au 1er !!??!! le dernier mot de quel liste ? le premier mot de quel liste ? on concaténe quoi et quoi ?? !! ou est l erreur ? quelle ligne ??

    "
    0
  2. stroumpf Messages postés 292 Statut Membre 2
     
    typedef struct L
    {
    int freq;
    char mot[C_TAILLE_MOT];

    struct L *suivant;
    } Liste;
    j'ai 2 liste chainée seq et seq2, chacune 2 contient des phrases exemple
    seq : bonjour le, le monde, ma famille
    seq2: bonjour le, le monde, famille ma
    on parcourt les 2liste et pour chaque element on verifier si le dernier mot ==au 1er
    ona ma famille et famille ma verifie bien la condition donc on mat "ma famille ma " dans une nouvelle liste chainee.
    ben voila beslae
    j'espere que je suis pas k***** comme ta dit!!
    0
  3. beslae Messages postés 109 Date d'inscription   Statut Membre 16
     
    Je te rassure, ce n est toujours pas le KAAA ! sinon je vai essayer de m adapter un peu a ton mode de communication, je crois qu il faudra aussi que j envisage de m y mettre vu le nombre des stroumpf sur ce genre de forum !!

    donc :
    strncmp(first, last,C_TAILLE_MOT)==0
    se traduit :
    comparer si first et last sont les meme
    strncomp("famille ma", "ma famille", 50) n est jamais 0 !!

    ceci d'une part, d'une autre, je comprend pas tes strtok(buffer," ,.-"); !!
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      strncomp("famille ma", "ma famille", 50) n est jamais 0 !!

      je suis d'accord avec toi

      en revanche
      strncomp("famille ma", "famille ma", 50) égal  0 !! 
      n'est-ce pas?!

      les mots proviennent des deux listes seq et seq2, donc je pense qu'il y a la possibilité d'avoir des mots qui existent dans seq2 et seq

      0
  4. stroumpf Messages postés 292 Statut Membre 2
     
    merci beslae, les daux focntion getforstword et getlastword marchent nikel, donc l'erreur n'est pas là, l'erreu est dans GenNseq, une erreur d'allocation de memoire
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. beslae Messages postés 109 Date d'inscription   Statut Membre 16
     
    et ca donne quoi gcc comme erreur exactement ?
    0
  7. stroumpf Messages postés 292 Statut Membre 2
     
    erreur de segmentation^^
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      affiche ici ce que tu vois à l'écran (je parle de ton erreur)
      0
      1. stroumpf Messages postés 292 Statut Membre 2 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        Bonjour Lami ca va bien ?
        j(ai pas un message d'erreur mais le programme se plante : projet a cessé de fonctionné....
        voilà c'est tout
        Liste * GenNseq(Liste **seq2, Liste **seq)
        {
           Liste *p;
           Liste *q;
           char * mot=(char*)malloc(60*sizeof(char));
           char * mot1= (char*)malloc(60*sizeof(char));
           char *last;
           char *first;
           char buff1[C_TAILLE_MOT];/* pas besoin de malloc car 50 est une petite taille et ca s'ajuste avec Liste::mot */
           char buff2[C_TAILLE_MOT];/* deux buffer temporaire: un pour chaque liste!*/
           Liste *pNouvelleListe;/* pour creer la liste*/
           Liste *pCourant;
        //   mot =(char*)malloc(60*sizeof(char));
          //    mot1 =malloc(60*sizeof(char));
        
        
           pNouvelleListe=NULL;
        
           for(p=*seq2; p!=NULL; p=p->suivant)
           {
              mot=p->mot;
        
              printf("%s", mot);
              if(mot){
                 first=GetFirstWord(mot, buff1);
                 printf("%s", first);
                 for(q=*seq; q!=NULL; q=q->suivant)
                 {
                    mot1 =q->mot;
                    if(mot1){
                       last=GetLastWord(mot1, buff2);
                       printf("%s", last);
                       if(strncmp(first, last,C_TAILLE_MOT)==0)
                       {
                          printf("similaires!!!!");
                          pCourant = malloc(sizeof(Liste));
                          pCourant->freq = 1;
                          strncpy(pCourant->mot,first,C_TAILLE_MOT);
                          pCourant->suivant = pNouvelleListe;
                          pNouvelleListe = pCourant;
                       }
                    }
                 }
              }
           }
        
        free(mot);
        free(mot1);
           return pNouvelleListe;
        }
        
        
        
        

        cordialement
        0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    mets en commentaire ta fonction GenNseq

    mets cette fonction dans ton code
    void Affiche_L(Liste *seq2, Liste *seq)
    {
       Liste *p;
       Liste *q;
       for(p=seq2; p!=NULL; p=p->suivant)
          printf("%s\n",p->mot);
    
       for(q=seq; q!=NULL; q=q->suivant)
          printf("%s\n",q->mot);
    }
    compile est exécute ensuite dit si tu se passe bien

    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      en fait jai mis ca
      void Affiche_L(Liste **seq2, Liste **seq)
      {
         Liste *p;
         Liste *q;
         for(p=*seq2; p!=NULL; p=p->suivant)
            printf("%s\n",p->mot);
      
         for(q=*seq; q!=NULL; q=q->suivant)
            printf("%s\n",q->mot);
      }
      
      

      car au depart jai declaré Liste **seq2 et Liste **seq
      et comme ca il plante meme probleme
      je sais pas si je fais des conneriees
      0
  9. stroumpf Messages postés 292 Statut Membre 2
     
    seq2 est une liste chainée ainsi que seq est un tableau de liste chainé
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      non
      d'après ce que tu dis seq2 est aussi un pointeurs de pointeurs donc décide toi
      0
      1. stroumpf Messages postés 292 Statut Membre 2 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        non c'est une simple liste chainée
        decidé c'est bon ^^
        0
  10. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    d'accord
    donc en fait il s'agit des pointeurs de pointeurs, c'est pour ça que tu as une erreur de segmentation ici

    Liste * GenNseq(Liste *seq2, Liste *seq);

    je vais revoir ta fonction
    0
  11. stroumpf Messages postés 292 Statut Membre 2
     
    Liste * GenNseq(Liste **seq2, Liste **seq)
    {
       Liste *p;
       Liste *q;
       char * mot=(char*)malloc(60*sizeof(char));
       char * mot1= (char*)malloc(60*sizeof(char));
       char *last;
       char *first;
       char buff1[C_TAILLE_MOT];/* pas besoin de malloc car 50 est une petite taille et ca s'ajuste avec Liste::mot */
       char buff2[C_TAILLE_MOT];/* deux buffer temporaire: un pour chaque liste!*/
       Liste *pNouvelleListe;/* pour creer la liste*/
       Liste *pCourant;
    //   mot =(char*)malloc(60*sizeof(char));
      //    mot1 =malloc(60*sizeof(char));
    
    
       pNouvelleListe=NULL;
    
       for(p=*seq2; p!=NULL; p=p->suivant)
       {
          mot=p->mot;
    
          printf("%s", mot);
          if(mot){
             first=GetFirstWord(mot, buff1);
             printf("%s", first);
             for(q=*seq; q!=NULL; q=q->suivant)
             {
                mot1 =q->mot;
                if(mot1){
                   last=GetLastWord(mot1, buff2);
                   printf("%s", last);
                   if(strncmp(first, last,C_TAILLE_MOT)==0)
                   {
                      printf("similaires!!!!");
                      pCourant = malloc(sizeof(Liste));
                      pCourant->freq = 1;
                      strncpy(pCourant->mot,first,C_TAILLE_MOT);
                      pCourant->suivant = pNouvelleListe;
                      pNouvelleListe = pCourant;
                   }
                }
             }
          }
       }
    
    free(mot);
    free(mot1);
       return pNouvelleListe;
    }
    

    meme comme ca sa plante
    0
  12. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    tu veux arrêter d'afficher à chaque fois ton code

    que sa plante on le sait depuis le début

    donc soit claire

    seq2 c'est quoi????
    seq c'est quoi????

    on ne mets pas les étoiles comme sur les gâteux
    il faut savoir avec exactitude le type que tu dois utiliser.
    0
  13. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    non c'est une simple liste chainée
    decidé c'est bon ^^


    En ce cas le prototype de ta fonction doit être (si j'ai bien compris)

    Liste * GenNseq(Liste *seq2, Liste **seq)

    seq2 - liste chaînée
    seq - table de hash

    c'est bien ça?

    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      seq n'est pas une table de hachage, c'est n autre tableau que j'ai declaré
      seq =(Liste **) malloc (20000 * sizeof(Liste *)); // les tableau des toutes les Nseq
          seq[0]=NULL;
      0
  14. stroumpf Messages postés 292 Statut Membre 2
     
    oui,
    seq2 est une liste chainée qui contient les mots, et seq est un tableau de liste chaine qui va contenier des liste chainée .
    voilà
    0
  15. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Et tu veux vérifier pour chaque mot de seq2 tout les mots de seq (les listes dans le tableau de listes)
    C'est ça?
    0
  16. stroumpf Messages postés 292 Statut Membre 2
     
    oui je vais verifier pour chaque mot de seq et de seq 2
    si le dernier mot de seq est egale au 1er de seq alors on cree une nouvelle liste qui cva contenier le mot resultat de la concatenation et on va mettre cette nouvelle liste dans seq[1](2eme case)
    0
  17. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Attends, tu mélanges tout.

    si le dernier mot de seq est egale au 1er de seq

    tu voulais dire

    si le dernier mot de chaque liste de seq égal au 1er de seq2

    Tu as obtenu comment le seq (le tableau de liste)??
    Il a combien des listes dans ton tableau??

    Puisque en fait ton algorithme sera
    Pour chaque mot de la liste seq2
      Cherche le first
        Pour chaque mot de chaque liste du tableau de liste seq
           Cherche last
             Si last égal first Alors
               Affiche "Similaire"
               Allouer NouveauElement
               NouveauElement->freq = 1
               copier(NouveauElement->mot,first)
               NouveauElement->suivant = pNouvelleListe
               pNouvelleListe = NouveauElement
            Fin Si
        Fin Pour
    Fin Pour


    0
  18. stroumpf Messages postés 292 Statut Membre 2
     
    chaque elemnt de la liste seq 2 contient une suite de mot
    "bonjour les "
    la meme chose pour seq: en fait jai mis dans la 1ere case des seq la liste des 2
    apres je vais comparer pour chaque elemnt de seq2 si le 1er mot =dernier mot des seq[0]
    "bonjour les " et" bonjour les"
    on a les <>bonjour donc pas de concatenation
    ainsi de suite
    si on a parexemple: "bonjour les " et "les amis " donc on va creer une liste chaine qui va contenir 'bonjour les amis" et on va la mettre dans seq [1]
    voila
    et ainsi de suite
    0
  19. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    la meme chose pour seq:

    Non, ce n'est pas la même chose.
    Tu as dit que seq c'est un tableau de listes.

    Lit mont algorithme

    Chaque élément de seq c'est une liste

    Donc tu ne peux pas dire

    chaque elemnt de la liste seq 2 contient une suite de mot
    "bonjour les "
    la meme chose pour seq:


    en revanche tu peux dire

    chaque elemnt de la liste seq 2 contient une suite de mot
    "bonjour les "
    et chaque element du chaque liste du tableau seq

    Ca ne m'intéresse pas ton histoire avec "bonjour les" ;-)

    Ce que tu dois de décider c'est où on cherche
    Si seq2 c'est juste une liste et seq un tableau alors l'algo que je t'ai donné doit être bon
    Sinon, alors tu dois mieux expliquer ce que tu veux obtenir, et sans mélanger les choses

    Tu vois seulement la partie finale (les mots) que tu dois comparer.

    Mais ce qui nous intéresse pour l'instant ce n'est pas ça.
    Où les chercher nous intéresse.

    Donc comme je te l'ai déjà dit. Si tu cherches dans un tableau de liste, alors le mot sera chercher par la fonction, dans chaque liste (élément du tableau).

    0
  20. stroumpf Messages postés 292 Statut Membre 2
     
    merci Lami,
    voila nos input;
    seq 2 qui va contenir des liste de portion de phrase(2mots)
    et ona seq qui est un tableau vide
    on a rempli la 1ere case du tableau par la liste des seq2 (copier)
    et puis on va tenter de remplir les autres case du tableau
    pour rempli la case 2
    on concatene les portions de pharse de seq 2 et de seq[0] qui ont la meme 1er et dernier mot
    on met le resultat dans la case suivante seq[1]
    voilà
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      tu tournes en rond
      ce n'est pas seq2 qui était ma question (ça je l'ai bien compris)

      moi, je parle de **seq

      le résultat de ne le mets dans aucune case !!!!!!!!!!!!!!!!!!!!!!!!!!
      tu crées une NouvelleListe en utilisant les mots de seq2 et ce que tu trouves dans les cases (listes) seq[0] ........seq[19999] de ton tableau de listes !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

      teste la fonction que je t'ai donnée
      0
  21. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    quelque chose comme ça
    Liste * GenNseq(Liste *seq2, Liste **seq)
    {
       Liste *p;
       Liste *q;
       int i;
       char * mot;
       char * mot1;
       char *first;
       char *last;
       char buff1[C_TAILLE_MOT];/* pas besoin de malloc car 50 est une petite taille et ca s'ajuste avec Liste::mot */
       char buff2[C_TAILLE_MOT];/* deux buffer temporaire: un pour chaque liste!*/
       Liste *pNouvelleListe;/* pour creer la liste*/
       Liste *pCourant;
    
       pNouvelleListe=NULL;
       for(p=seq2; p!=NULL; p=p->suivant){
          mot=p->mot;
          if(mot){
             first=GetFirstWord(mot, buff1);
             for(i=0;i<20000;++i){ // pour chaque élément (liste) de seq
               for(q=seq[i]; q!=NULL; q=q->suivant){ // seq[i] - element(liste) de seq
                 mot1 =q->mot;
                 if(mot1){
                   last=GetLastWord(mot1, buff2);
                   if(strncmp(first, last,C_TAILLE_MOT)==0){
                     printf("similaires!!!!");
                     pCourant = malloc(sizeof(Liste));
                     pCourant->freq = 1;
                     strncpy(pCourant->mot,first,C_TAILLE_MOT);
                     pCourant->suivant = pNouvelleListe;
                     pNouvelleListe = pCourant;
                   }
                 }
               }
             }
          }
       }
       return pNouvelleListe;
    }
    
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      merci Lami, je sais pas si j'etais claire ^^
      0
    2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > stroumpf Messages postés 292 Statut Membre
       
      Re,

      Pas du tout.
      0
    3. stroumpf Messages postés 292 Statut Membre 2 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
       
      oula ca plante encore;
      il a affiché similaire!!!! et puis il se plante
      :(
      0
    4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > stroumpf Messages postés 292 Statut Membre
       
      T'attends quoi pour afficher ici l'erreur.
      0
    5. stroumpf Messages postés 292 Statut Membre 2 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
       
      il na rien affiché lami sauf le message: projet a cessé de fonctionner...
      0
  • 1
  • 2
  • 3