J'ai une question concernant qsort.Problème avec qsort() - Le tri n'est pas fait correctement (C)
C'est un peu bizarre, mais ma fonction qsort ne me donne pas la bonne sortie. La chose étrange est que certaines de mes fonctions de comparaison sont identiques à mes projets passés, mais ils ne me donnent pas la bonne entrée du tout. Je ne suis pas sûr de savoir comment le tester.
Par exemple:
int comp_name_asc(const void *a, const void *b)
{
const Rec *prec1 = (const Rec *) a;
const Rec *prec2 = (const Rec *) b;
return strcmp(prec1->name, prec2->name);
}
int comp_name_desc(const void *a, const void *b)
{
const Rec *prec1 = (const Rec *) a;
const Rec *prec2 = (const Rec *) b;
return strcmp(prec2->name, prec1->name);
}
La deuxième fonction doit être à l'ordre décroissant, mais le résultat est identique: il est toujours dans l'ordre croissant. J'ai vérifié pour m'assurer que la bonne fonction est entrée au bon moment. Rec est un typedef pour une structure que j'ai faite, qui a un paramètre char * name.
également (Modifiée pour éviter tout débordement):
int comp_size_asc(const void *a, const void *b)
{
const Rec *prec1 = (const Rec *) a;
const Rec *prec2 = (const Rec *) b;
if (prec1->byteSize > prec2->byteSize)
return 1;
else if (prec1->byteSize < prec2->byteSize)
return -1;
else
return 0;
}
Le résultat est tout à fait bizarre, pas croissant ou décroissant (par exemple: 500, 515, 100, 200 ...). byteSize est de type off_t obtenu en faisant:
char *path; // Build the path
struct stat sb;
if (lstat(path, &sb) == 0) {
// Read sb.st_size
Je ne suis vraiment pas sûr de savoir comment le débugger. Tout ce que je sais, c'est que la fonction de comparaison appropriée est entrée, et que certaines fonctions de comparaison similaires utilisées dans le passé.
Toute idée ou comment je peux déboguer ce serait la bienvenue. Je vous remercie.
EDIT:
Ajout de l'appel à qsort: (. Chaque fois qu'un élément est ajouté à la matrice, l'indice est incrémenté)
int index = 0;
Rec **array = (Rec **) malloc(sizeof(Rec *) * capacity);
// Adds element to the array...
qsort(array, index, sizeof(Rec *), comp_name_desc);
Merci.
EDIT:
La solution a été donnée ci-dessous. Je vous remercie!
je devais changer:
const Rec *prec1 = (const Rec *) a;
à
const Rec *prec1 = *(const Rec **) a;
à cause de la façon dont je définissais mon tableau. Merci!
Bienvenue sur SO. +1 de moi pour une question bien écrite et un code très bien formaté. – Arun
Pouvez-vous montrer le code où vous appelez qsort()? Dans le cas de la "taille ascendante", les enregistrements sont-ils triés par nom? – psmears
BTW, ce n'est pas une bonne idée d'utiliser la soustraction dans la fonction de comparaison: en cas de dépassement d'entier, vous obtiendrez des comparaisons incohérentes. – zvrba