Probleme avec la fonction compare et qsort

Résolu
chrislains Messages postés 4 Statut Membre -  
chrislains Messages postés 4 Statut Membre -
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. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
  2. chrislains Messages postés 4 Statut Membre
     
    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. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      int compare (releve *a , releve *b)
      Pourquoi, avoir changé le prototype de la fonction ? C'était mieux avec const void* ;-)
      0
    2. chrislains Messages postés 4 Statut Membre
       
      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. chrislains Messages postés 4 Statut Membre
       
      j'ai trouver mon erreur
      il fallait juste ecrire releve const *pa =a
      pareil pour b

      merci fiddy pour tes reponses
      0