[Code C] Problème de quicksort
Dernière réponse : dans Programmation
Bonjour à tous !!
Voilà , comme indiqué dans le titre, j'ai un problème dans ma fonction quicksort (tri rapide). Cette fonction est intégrée à un programme qui recréer un algortihme génétique (en version simplifiée). Suelement voilà , le quicksort ne s'effectue pas correctement et provoque une erreur de segmentation. C'est un algorithme récursif, dans la théorie eil fonctionne (par rapport aux algos sur le net) mais ça ne va pas plus loin ...
Si quelqu'un aurait la gentillesse de m'aider ça serait sympa
Donc voici la fonction en question :
Edit :
Si vous avez des questions concernant le code que vous n'avez pas compris, n'hésitez pas à le demander
Merci pour votre aide
Voilà , comme indiqué dans le titre, j'ai un problème dans ma fonction quicksort (tri rapide). Cette fonction est intégrée à un programme qui recréer un algortihme génétique (en version simplifiée). Suelement voilà , le quicksort ne s'effectue pas correctement et provoque une erreur de segmentation. C'est un algorithme récursif, dans la théorie eil fonctionne (par rapport aux algos sur le net) mais ça ne va pas plus loin ...
Si quelqu'un aurait la gentillesse de m'aider ça serait sympa
Donc voici la fonction en question :
Edit :
Si vous avez des questions concernant le code que vous n'avez pas compris, n'hésitez pas à le demander
Merci pour votre aide
Autres pages sur : code probleme quicksort
Lassé par la pub ? Créez un compte
Citation :
il est un peu tard pour réfléchir mais tu as surement des problèmes de mémoire vu que tu ne libère pas la mémoire créée pour le pivot et les autres pointeurs ?d'ailleur, sont-ils vraiment utiles ?
Euh oui je ne libère pas la mémoire effectivement. Ca peut être à l'originie du problème ?
A mon avis oui ils sont utiles vu que j'en ai besoin pour manipuler les donnés
Citation :
je dirait meme qu'aucun malloc n'est nécessaire ...ps : je connais pas l'algo de quicksort par coeur
Pourquoi ce n'est pas nécessaire ? Il en faut pour allouer de la mémoire aux nouvelles variables non ?
PS : merci de répondre aussi tard
Je suis pas un as de la prog
Citation :
is_empty_pop : tu devrais vérifier que le pointeur qu'on te passe ne soit pas null
is_empty_pop(NULL); //< pouf ! segfault
BOOL is_empty_pop (Population pop)
{
if ((pop->NextIndiv == NULL) && (pop->people == NULL)) // Teste si la population est vide
{
return TRUE;
}
else
{
return FALSE;
}
}
La condition du if tel qu'elle est actuellement ne vérifie pas si c'est vide ?
patcoll a dit :
BOOL is_empty_pop (Population pop)
{
if ((pop->NextIndiv == NULL) && (pop->people == NULL)) // Teste si la population est vide
{
return TRUE;
}
else
{
return FALSE;
}
}
La condition du if tel qu'elle est actuellement ne vérifie pas si c'est vide ?
non, elle verifie qu'on a spécifier une valeur et qu'il n'y pas de suivant...
patcoll a dit :
Population retour;
retour = concat( (insert_pop_tail(quicksort(p1),(pivot->people))), (quicksort(p2)) );
free (retour);
return retour;
non !
pas liberer cette memoire la
bon, avant de regarder au pertes mémoires, essaye de faire fonctionner le tri
ensuite pense au pertes ...
je te conseil de prendre une feuille de brouillon et de faire des petits dessins pour te représenter les zone mémoire et les liaisons entre elles...
Citation :
376 & 377 : perte de la mémoire allouée respectivement deux lignes plus hautDonc je dois enlever l'allocation des lignes 374 et 375 ?
Citation :
non !pas liberer cette memoire la
bon, avant de regarder au pertes mémoires, essaye de faire fonctionner le tri
ensuite pense au pertes ...
je te conseil de prendre une feuille de brouillon et de faire des petits dessins pour te représenter les zone mémoire et les liaisons entre elles...
C'est surtout pour ça que je suis venu poster ici
bon, la nuit porte conseil...
voici une nouvelle fonction qui rajoute une population a la fin d'une autre
et un autre qui renvoi le dernier element de la population
et maintenant le tri en lui meme
en espérant que tu ai compris...
voici une nouvelle fonction qui rajoute une population a la fin d'une autre
Population population__push_back (Population that, Population newOne)
{
if (is_empty_pop(that)) {
return newOne
} else {
Population fin = tail(that);
fin->NextIndiv = newOne;
}
return that;
}
et un autre qui renvoi le dernier element de la population
Population tail(Population p) {
while ( rest(p) != NULL) { p = rest(p); }
return p;
}
et maintenant le tri en lui meme
/*********************************************************************
* Fonction qui effectue le tri rapide *
*********************************************************************/
Population quicksort(Population p)
{
// Si la population est vide ou si elle ne contient qu'un seul élément, la liste est donc déjà triée donc est renvoyée tel quel
if (p == NULL || rest(p) == NULL ) {
return p;
} else {
//Déclaration d'élements "Population" permettant de faire le tri
Population pivot = p;
Population ppp = NULL, ppg = NULL;
Population p_parcours = rest(p);
// Tant qu'on a pas parcouru toute la population à trier, on teste si la qualité de l'élément courant est inférieure ou supérieure à la qualité de l'élément pivot. Si inférieur, on la place à la fin de la liste p1, sinon à la fin de la liste p2.
while (p_parcours != NULL)
{
if ( (individu_quality(listbit_decode(head_value(p_parcours)))) < (individu_quality(listbit_decode(head_value(pivot)))) )
{
ppp = population__push_back(ppp, p_parcours);
}
else
{
ppg = population__push_back(ppg, p_parcours);
}
p_parcours = rest(p_parcours);
}
ppp = quicksort(ppp);
ppg = quicksort(ppg);
pivot->NextIndiv = ppg;
tail(ppp)->NextIndiv = pivot;
return ppp;
}
}
en espérant que tu ai compris...
patcoll a dit :
Le prof de TP m'a appris à faire les header de cette manière, donc j'ai appliqué sa méthode
Tu conseilles quoi ?
http://mapage.noos.fr/emdel/codage.htm
Re
La fonction ne fait plus d'erreur de segmentation mais ne calcule pas, elel reste bloquée, j'ai mis des printf à quelques endroits pour voir ou elle bloquait, donc voici le quicksort :
Et il ne fait plus rien depuis 3 min ...
Peut être un problème dans les autres fonctions mais je ne sais pas du tout
La fonction ne fait plus d'erreur de segmentation mais ne calcule pas, elel reste bloquée, j'ai mis des printf à quelques endroits pour voir ou elle bloquait, donc voici le quicksort :
/**************************************
* Fonction qui effectue le tri rapide *
**************************************/
Population quicksort(Population p)
{
// Si la population est vide ou si elle ne contient qu'un seul élément, la liste est donc déjà triée donc est renvoyée tel quel
if (p == NULL || rest(p) == NULL )
{
return p;
}
else
{
//Déclaration d'élements "Population" permettant de faire le tri
Population pivot = p;
Population ppp = NULL, ppg = NULL;
Population p_parcours = rest(p);
// Tant qu'on a pas parcouru toute la population à trier, on teste si la qualité de l'élément courant est inférieure ou supérieure à la qualité de l'élément pivot. Si inférieur, on la place à la fin de la liste p1, sinon à la fin de la liste p2.
printf("Avant while\n");
while (p_parcours != NULL)
{
printf("Debut while\n");
if ( (individu_quality(listbit_decode(head_value(p_parcours)))) < (individu_quality(listbit_decode(head_value(pivot)))) )
{ printf("Debut if\n");
ppp = concat(ppp, p_parcours);
}
else
{
ppg = concat(ppg, p_parcours);
}
p_parcours = rest(p_parcours);
}
printf("Sortie du while\n");
ppp = quicksort(ppp);
ppg = quicksort(ppg);
pivot->NextIndiv = ppg;
tail(ppp)->NextIndiv = pivot;
return ppp;
}
}
L'individu 19 vaut 52, Sa qualite est de : -0.352539
L'individu 20 vaut 2, Sa qualite est de : -0.968994
**** Tri en cours ****
Avant while
Debut while
Debut while
Debut while
Et il ne fait plus rien depuis 3 min ...
Peut être un problème dans les autres fonctions mais je ne sais pas du tout
J'ai lancé gdb, et apparement, le problème vient de la ligne 4 :
EDIT : apparement gdb il a des problèmes avec les if parce qeu dans quicksort la première erreur qu'il me trouve c'est dans le premier if ...
Population concat (Population that, Population newOne)
{
if (is_empty_pop(that)) {
return (newOne);
} else {
Population fin = tail(that);
fin->NextIndiv = newOne;
}
return that;
}
Breakpoint 1 at 0x80489f7: file gen.c, line 349.
EDIT : apparement gdb il a des problèmes avec les if parce qeu dans quicksort la première erreur qu'il me trouve c'est dans le premier if ...
la réponse postée sur HFR est interressante : http://forum.hardware.fr/hfr/Programmation/C/code-probl...
ceci permet aussi de relier les deux sujets
ceci permet aussi de relier les deux sujets
Bon j'ai réussi à avancer un peu
Maintenant il sort du while etc ... mais il refait une erreur de segmentation
Les fichiers gen.h et Test.c sont les mêmes depuis le début, voici la fonction quicksort modifiée :
Voici ce qui est affiché lors de l'éxécution du prog :
Maintenant il sort du while etc ... mais il refait une erreur de segmentation
Les fichiers gen.h et Test.c sont les mêmes depuis le début, voici la fonction quicksort modifiée :
/**************************************
* Fonction qui effectue le tri rapide *
**************************************/
Population quicksort(Population p)
{
// Si la population est vide ou si elle ne contient qu'un seul élément, la liste est donc déjà triée donc est renvoyée tel quel
if (p == NULL || rest(p) == NULL )
{
return p;
}
else
{
//Déclaration d'élements "Population" permettant de faire le tri
Population pivot = p;
Population ppp = NULL, ppg = NULL;
Population p_parcours = rest(p);
// Tant qu'on a pas parcouru toute la population à trier, on teste si la qualité de l'élément courant est inférieure ou supérieure à la qualité de l'élément pivot. Si inférieur, on la place à la fin de la liste p1, sinon à la fin de la liste p2.
printf("Avant while\n");
while (p_parcours != NULL)
{
printf("Debut while\n");
if ( (individu_quality(listbit_decode(head_value(p_parcours)))) < (individu_quality(listbit_decode(head_value(pivot)))) )
{ printf("Debut if\n");
ppp = insert_pop_tail(ppp, (p_parcours->people));
}
else
{printf("Debut else\n");
ppg = insert_pop_tail(ppg, (p_parcours->people));
}
p_parcours = rest(p_parcours);
}
printf("Sortie du while\n");
ppp = quicksort(ppp);
printf("Je vais rentrer dans ppg\n");
ppg = quicksort(ppg);
printf("Je sors de ppg\n");
pop_print(ppp);
pop_print(ppg);
pivot->NextIndiv = ppg;
tail(ppp)->NextIndiv = pivot;
return ppp;
}
}
Voici ce qui est affiché lors de l'éxécution du prog :
Debut else
Sortie du while
Je vais rentrer dans ppg
Je sors de ppg
L'individu 1 vaut 242, Sa qualite est de : -0.793213
L'individu 1 vaut 30, Sa qualite est de : -0.586182
Je sors de ppg
La population entree est vide
L'individu 1 vaut 242, Sa qualite est de : -0.793213
L'individu 2 vaut 228, Sa qualite est de : -0.610352
L'individu 3 vaut 30, Sa qualite est de : -0.586182
Erreur de segmentation (core dumped)
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
![[:matleflou] [:matleflou]](http://m.bestofmedia.com/sfp/design/usr/fr/smilies/1d/22/matleflou.gif)