[Code C] Problème de quicksort

Shor-T

Grand Maître
Bonjour à tous !! :hello:

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 :merci:
 

KangOl

Grand Maître
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 ?
 

KangOl

Grand Maître
je dirait meme qu'aucun malloc n'est nécessaire ...

ps : je connais pas l'algo de quicksort par coeur
 

Shor-T

Grand Maître
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 :)

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 :D
Je suis pas un as de la prog :merci:
 

Shor-T

Grand Maître
D'accord :)

Voici le fichier Test.c, qui comme son nom l'indique est un fichier de tests :

Edit : je mettrai le programme plus tard ...
 

KangOl

Grand Maître
bon, apres avoir réfléchi, il te faut effectiver créer les deux populations temporaires (p1 et p2) mais faut les nettoyer apres la concatenation
 

KangOl

Grand Maître
sinon, un conseil :
c'est une bonne idée d'utiliser des header gardian cependant, faut pas les commencer par deux underscore, c'un un coup a avoir un clash avec un truc standard ca...
prefere un autre préfix plus personnel...
 

Shor-T

Grand Maître
Le prof de TP m'a appris à faire les header de cette manière, donc j'ai appliqué sa méthode :)

Tu conseilles quoi ?
 

KangOl

Grand Maître
is_empty_pop : tu devrais vérifier que le pointeur qu'on te passe ne soit pas null
Code:
is_empty_pop(NULL); //< pouf ! segfault
 

KangOl

Grand Maître

faut les faire, mais qu'il commence pas par __, qui est réservé au header standards...
 

Shor-T

Grand Maître
bon, apres avoir réfléchi, il te faut effectiver créer les deux populations temporaires (p1 et p2) mais faut les nettoyer apres la concatenation

Ben la fonction concat est dans le return du quicksort et vu que c'est du récursif, si je les libère ça va foutre le dawa non ?
 

Shor-T

Grand Maître
is_empty_pop : tu devrais vérifier que le pointeur qu'on te passe ne soit pas null
Code:
is_empty_pop(NULL); //< pouf ! segfault

[cpp]BOOL is_empty_pop (Population pop)
{
if ((pop->NextIndiv == NULL) && (pop->people == NULL)) // Teste si la population est vide
{
return TRUE;
}
else
{
return FALSE;
}
}[/cpp]

La condition du if tel qu'elle est actuellement ne vérifie pas si c'est vide ?
 

KangOl

Grand Maître

non, elle verifie qu'on a spécifier une valeur et qu'il n'y pas de suivant...
 

KangOl

Grand Maître

bha faut
1/ recuperer la valeur de concat dans une variable "r"
2/ nettoyer la memoire
3/ return r
 

Shor-T

Grand Maître
[cpp]BOOL is_empty_pop (Population pop)
{
if (pop == NULL) // Teste si la population est vide
{
return TRUE;
}
else
{
return FALSE;
}
}[/cpp]

De cette manière ça peut fonctionner ?
 

Shor-T

Grand Maître
bha faut
1/ recuperer la valeur de concat dans une variable "r"
2/ nettoyer la memoire
3/ return r

[cpp] Population retour;
retour = concat( (insert_pop_tail(quicksort(p1),(pivot->people))), (quicksort(p2)) );
free (retour);
return retour;[/cpp]
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 832
Membres
1 586 367
Dernier membre
ramkin
Partager cette page
Haut