[C ]erreur de segmentation dans une fonction
stroumpf
Messages postés
289
Date d'inscription
Statut
Membre
Dernière intervention
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 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 :
merci à vous
j'attends vos reponses
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:
- [C ]erreur de segmentation dans une fonction
- Fonction si et - Guide
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel
- Excel : Remplir une cellule en fonction d'une autre ✓ - Forum Excel
- Erreur 3000 france tv - Forum Lecteurs et supports vidéo
- Une erreur de communication est détectée dans le module de sécurité ✓ - Forum TNT / Satellite / Réception
47 réponses
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 ??
"
"
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!!
{
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," ,.-"); !!
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 revanche
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
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
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
erreur de segmentation^^
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
cordialement
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
Salut,
mets en commentaire ta fonction GenNseq
mets cette fonction dans ton code
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
en fait jai mis ca
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
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
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
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.
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?
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à
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?
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)
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 sera
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
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
"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
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).
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à
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
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 ça
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; }