Probleme avec la fonction compare et qsort
Résolu
chrislains
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
chrislains Messages postés 4 Date d'inscription Statut Membre Dernière intervention -
chrislains Messages postés 4 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Probleme avec la fonction compare et qsort
- Fonction si et - Guide
- Beyond compare - Télécharger - Gestion de fichiers
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
- Fonction remplacer sur word - Guide
2 réponses
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,
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,
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??
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??
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 :(
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 :(