Probleme avec qsort

Résolu
Noxk Messages postés 10 Date d'inscription dimanche 26 février 2006 Statut Membre Dernière intervention 27 mars 2007 - 11 mars 2006 à 17:11
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 12 mars 2006 à 17:22
bonjour,

voila j'ai un probleme avec qsort j'esssaie de faire un tri sur un tableau de structure mais j'obtiens une erreur d'acces violation, apparemment j'oublie une chose quelque part mais je ne vois pas ou. Voila mon code :

struct ESSAI
{
char car;
int Nb1;
int Nb2;
char *alpha;
};

int compare (const void *a, const void *b)
{
return _stricmp( *((char**)((ESSAI*) a)->alpha), *((char**)((ESSAI*) b)->alpha) );
}

#define SIZE 100000
void main ()
{
ESSAI *Array[SIZE];
int i, j;
int nb, len;
char car;
char Line[60];

for (i=0; i<SIZE; i++)
{
Array1[i] = new ESSAI;
}

srand((unsigned) time(NULL));

for (i=0; i<SIZE; i++)
{
memset(Line, 0, sizeof(char) * 60);
for (j=0; j<15; j++)
{
nb = rand() % 2;
if (nb)
{
nb = rand() % 26;
nb += 65;
Line[j] = (char) nb;
}
else
{
nb = rand() % 26;
nb += 97;
Line[j] = (char) nb;
}
}
len = strlen(Line)+1;
Array[i]->alpha = new char[len];
strcpy(Array[i]->alpha, Line);
}

qsort(*Array, SIZE, sizeof(ESSAI*), compare);

}

4 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
12 mars 2006 à 15:50
Salut,

La callback compare prend en parametre des pointeurs sur les elements
du tableau, ces element sont eux meme des pointeurs, donc au finale a
et b sont en fait des ESSAI**.

Par exemple:

int compare (const void *a, const void *b)

{

ESSAI* one = *(ESSAI**)a;

ESSAI* two = *(ESSAI**)b;

return _stricmp(one->alpha, two->alpha);

}



Ensuite pour l'appel de la fonction qsort, le troisieme param est bien la taille d'un element du tableau, soit sizeof(ESSAI*):

qsort(Array, SIZE, sizeof(ESSAI*), compare);
3
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
12 mars 2006 à 11:14
Salut,

Peut-etre est-ce que cela vient du fait que tu veux instancier 100.000 objets ESSAI ? Vérifie que le new alloue bel et bien de la mémoire à chacun de tes objets. (de plus Array1 n'est pas défini )

Dans ta fonction compare, il y a quelque chose que je ne saisis pas.
a->alpha est déja un char*...alors pourquoi le casté en char** (au lieu de faire '&') ? Puis de tout façon, tu mets un * devant le tout, alors je ne comprend pas l'interet de caster juste avant!
Pourquoi ne pas écrire ça comme ça ?

int compare (const void *a, const void *b)
{
return _stricmp( ((ESSAI*) a)->alpha), ((ESSAI*) b)->alpha) );
}

Prototype de la fonction qsort (stdlib.h) :

void qsort( void * tab, size_t nt, size_t taille, int (*fcmp)(const void *px1, const void *px2));


L'erreur vient peut-etre d'ici...toi tu passes en premier argument '*Array'. Or Array est un ESSAI*. En plus, la taille totale du tableau n'est pas égale à ESSAI* !! Try ceci et tient moi au courant :


qsort((void*) Array, SIZE, SIZE * sizeof(ESSAI), (fcpm) compare);
0
Noxk Messages postés 10 Date d'inscription dimanche 26 février 2006 Statut Membre Dernière intervention 27 mars 2007
12 mars 2006 à 17:15
Salut,

merci pour cette solution, je m'etais un peu melanger dans les pointeurs.
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
12 mars 2006 à 17:22
Salut,

Ben merci Aardman pour cette explication ! Pour le ESSAI** j'ai parlé trop vite...j'aurais trouvé ça en parlant moi vite et en réfléchissant avant
Pour qsort() je ne l'ai jamais utilisé, j'ai juste vu sur un site que le troisieme paramètre était "size_t taille"; donc j'en ai conclu (trop rapidement) que c'était la taille du tableau entier.
Hmmm...enfait je suis stupide, c'est logique même que ce soit la taille d'un seul élément...ça permet à la fonction de traiter le pointeur Array correctement afon de bien donner à la fonction compare() des void* de la taille de ESSAI*... j'étais fatigué avant moi, je suis excusable, non?
0
Rejoignez-nous