Probleme avec la fonction compare et qsort

Résolu
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

2 réponses

  1. Contributeur
    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
    1. 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
      1. Contributeur
        int compare (releve *a , releve *b)
        Pourquoi, avoir changé le prototype de la fonction ? C'était mieux avec const void* ;-)
        0
      2. 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
      3. j'ai trouver mon erreur
        il fallait juste ecrire releve const *pa =a
        pareil pour b

        merci fiddy pour tes reponses
        0