[C ]erreur de segmentation dans une fonction
lami20j Messages postés 21506 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
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
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.
-
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 ??
"
-
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!! -
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," ,.-"); !!
-
Salut,
strncomp("famille ma", "ma famille", 50) n est jamais 0 !!
je suis d'accord avec toi
en revanchestrncomp("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
-
-
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
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
et ca donne quoi gcc comme erreur exactement ?
-
-
- 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 toutListe * 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
-
-
Salut,
mets en commentaire ta fonction GenNseq
mets cette fonction dans ton codevoid 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
-
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
-
-
seq2 est une liste chainée ainsi que seq est un tableau de liste chainé
-
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 -
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 -
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. -
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?
-
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à -
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? -
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) -
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 seraPour 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
-
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 -
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).
-
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à-
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
-
-
Re,
quelque chose comme çaListe * 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; }
- 1
- 2
- 3