[C ]erreur de segmentation dans une fonction

Fermé
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 27 sept. 2008 à 06:43
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 27 sept. 2008 à 19:45
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
A voir également:

47 réponses

beslae Messages postés 109 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 11 octobre 2008 16
27 sept. 2008 à 06:54
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 07:01
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
beslae Messages postés 109 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 11 octobre 2008 16
27 sept. 2008 à 07:18
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 09:10
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 07:20
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
beslae Messages postés 109 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 11 octobre 2008 16
27 sept. 2008 à 07:47
et ca donne quoi gcc comme erreur exactement ?
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 09:01
erreur de segmentation^^
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 09:11
Salut,

affiche ici ce que tu vois à l'écran (je parle de ton erreur)
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
27 sept. 2008 à 09:16
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 09:17
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 09:21
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 09:23
seq2 est une liste chainée ainsi que seq est un tableau de liste chainé
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 09:25
Re,

non
d'après ce que tu dis seq2 est aussi un pointeurs de pointeurs donc décide toi
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
27 sept. 2008 à 09:26
non c'est une simple liste chainée
decidé c'est bon ^^
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 09:24
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 09:25
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 09:27
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 09:29
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 09:31
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 09:29
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 09:31
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 09:34
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 09:44
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 09:50
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 10:00
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 10:06
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 10:10
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
27 sept. 2008 à 10:06
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
27 sept. 2008 à 10:09
merci Lami, je sais pas si j'etais claire ^^
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569 > stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009
27 sept. 2008 à 10:10
Re,

Pas du tout.
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
27 sept. 2008 à 10:16
oula ca plante encore;
il a affiché similaire!!!! et puis il se plante
:(
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569 > stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009
27 sept. 2008 à 10:17
T'attends quoi pour afficher ici l'erreur.
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
27 sept. 2008 à 10:19
il na rien affiché lami sauf le message: projet a cessé de fonctionner...
0