Probleme avec la fonction compare et qsort

Résolu/Fermé
chrislains Messages postés 4 Date d'inscription samedi 29 décembre 2012 Statut Membre Dernière intervention 10 mai 2013 - 10 mai 2013 à 16:51
chrislains Messages postés 4 Date d'inscription samedi 29 décembre 2012 Statut Membre Dernière intervention 10 mai 2013 - 10 mai 2013 à 18:38
Bonjour,

je cherche a utiliser la qsort pour trier un fichier mais j'ai ce message d'erreur qui vient de ma fonction compare "tp6.c:107:18: erreur: déréférencement d'un pointeur de type incomplet"

typedef struct {
int annee;
int mois;
int jour;
float tx; // température maximale du jour
float tn; // température minimale du jour
float rr; // précipitations du jour
float w; // ensoleillement du jour
} releve;

int compare (void const*a , void const *b)
{
struct releve const *pa = a;
struct releve const *pb = b;
return strcmp (pa->tx, pb->tx);
}

qsort(t, 366, sizeof(releve), compare);
int p=0;

while(p<n){
p++;
r=t[p];
printf("%3d : %02d-%02d-%d %5.1f oC %5.1f oC %5.1f mm %4.1f h\n",
n,
r.jour, r.mois, r.annee, r.tx, r.tn, r.rr, r.w);
}

besoin de votre aide s'il vous plait
A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
10 mai 2013 à 17:31
Bonjour,

Deux erreurs :
struct releve const *pa = a;
struct releve const *pb = b;

struct releve n'existe pas. Il s'agit du type releve (cf. ton typedef).

return strcmp (pa->tx, pb->tx);
pa->tx est de type float (et non de type char*). Tu ne peux donc pas utiliser strcmp(). Un simple : return pa->tx - pb->tx; fera l'affaire.
D'ailleurs, pour bien faire, il faudrait même tenir compte d'une tolérance epsilonienne : si la différence entre pa->tx et pb-> tx est suffisamment petite alors on renvoie 0.

Cdlt,
1
chrislains Messages postés 4 Date d'inscription samedi 29 décembre 2012 Statut Membre Dernière intervention 10 mai 2013
10 mai 2013 à 18:10
merci fiddy pour ta reponse

j'ai modifier ma fonction compare

int compare (releve *a , releve *b) {
releve *pa = a;
releve *pb = b;
return pa->tx - pb->tx;
}

mais le compilateur trouve une erreur au niveau de la fonction qsort
qsort(t, 366, sizeof(releve), compare);

voici l'erreur " tp6.c:127:4: attention : passing argument 4 of `qsort' from incompatible pointer type [enabled by default] "

pouvez me dire ou est ma betise svp??
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
10 mai 2013 à 18:19
int compare (releve *a , releve *b)
Pourquoi, avoir changé le prototype de la fonction ? C'était mieux avec const void* ;-)
0
chrislains Messages postés 4 Date d'inscription samedi 29 décembre 2012 Statut Membre Dernière intervention 10 mai 2013
10 mai 2013 à 18:33
int compare (const void *a , const void *b) {
releve *pa = a;
releve *pb = b;
return (pa->tx > pb->tx) - (pa->tx < pb->tx);
}

la j'ai modifier mais sa me met ce warning " tp6.c:104:14: attention : initialization discards `const' qualifier from pointer target type [enabled by default] " a ce niveau
releve *pa = a;
releve *pb = b;

j'arrive pas a comprendre :(
0
chrislains Messages postés 4 Date d'inscription samedi 29 décembre 2012 Statut Membre Dernière intervention 10 mai 2013
10 mai 2013 à 18:38
j'ai trouver mon erreur
il fallait juste ecrire releve const *pa =a
pareil pour b

merci fiddy pour tes reponses
0