IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Utilisation de qsort() en c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Par défaut Utilisation de qsort() en c
    Bon réveil a tout le monde

    je rencontre un problème quand a l'utilisation de qsort()
    Le but de mon programme est de trier un fichier qui me sert de dictionnaire
    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int compare (void const *a, void const *b)
    {
     
       char *const *pa = a;
       char *const *pb = b;
     
       return strcmp (*pa, *pb);
    }
     
    int Nb_mot()
    {
        char c[15];
        FILE *file;
        int compteur=0;
     
        file=fopen("dictionnaire","r");
        while (!feof(file))
        {
              fgets(c, 17, file);
              compteur++;
        }
        fclose(file);
        printf("%d",compteur);
        return compteur;
    }
     
    int main (void)
    {
     
       int nbmot,i;
       nbmot=Nb_mot();
       FILE *file;
       printf("il y a %d mots dans le dictionnaire ",nbmot);
       char **c=malloc(nbmot*sizeof(char));
       for (i=0;i<nbmot;i++)
       {
           c[i]=malloc (15*sizeof(char));
       }
       char const *tab[] = { "world", "hellos", "hello" };
       char chaine[15];
       file=fopen("dictionnaire","r");
     
       for (i=0;i<nbmot;i++)
       {
                        fgets(chaine, 17, file);
                        strcpy(c[i],chaine);
                        printf("%s",c[i]);
     
       }
       //qsort (c, sizeof c / sizeof *c, sizeof *c, compare);
       printf("%s",c[1]);
       getchar();
     
     
    }
    Mon tableau de chaines contient bien tout les mots de mon fichier
    Lorsque je lance mon programme sa plante
    J'ai bien sur mis un printf avant & après qsort pour vérifier que c'était bien l'appel la cause
    Par contre si je fais appel avec tab au lieu de c, j'obtient bien un tri
    Est du au const? ou a une erreur de pointeur?
    Ou plus probable une erreur de ma part ?
    Pas moyen que je trouve pourquoi sa ne marche pas
    Quelqu'un peut il m'aider?
    Merci de votre aide et bonne journée a vous

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    sizeof() ne marche que sur les vrais tableaux, pas sur les pointeurs.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       char **c=malloc(nbmot*sizeof(char *));

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Plutôt que faire une boucle pour allouer de la mémoire, tu peux tout simplement lire ta ligne (fgets) et juste après faire un strdup
    Et surtout n'oublie pas de libérer ta mémoire !
    Pour passer une fonction en paramètre il faut utiliser le & (&compare).

    Oublie pas le return 0 (ou EXIT_SUCCESS) à la fin de ton main ^^

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Par défaut Sa marche
    Rebonjour et merci de vos réponse
    grace a vous je suis débarassé de ce probleme assez énervant


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     char **c=malloc(nbmot*sizeof(char *));
    Effectivement c'est plus logique et sa explique pourquoi qsort() fesait planter le programme

    Une fois que je l'ai changé, plus de plantage mais toujours pas de tri
    j'ai donc suivit ce conseil
    sizeof() ne marche que sur les vrais tableaux, pas sur les pointeurs.
    et j 'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qsort (c,sizeof c / sizeof *c, sizeof *c, compare);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qsort (c,nbmot, sizeof *c, compare);
    Et la mon tri s'effectue sans problémé

    Plutôt que faire une boucle pour allouer de la mémoire, tu peux tout simplement lire ta ligne (fgets) et juste après faire un strdup
    Et surtout n'oublie pas de libérer ta mémoire !
    Pour passer une fonction en paramètre il faut utiliser le & (&compare).
    j'avoue n'avoir jamais utilisé strdup (autrement dit je me sers toujours d'une boucle
    mais je vais me renseigner sur strdup

    Oublie pas le return 0 (ou EXIT_SUCCESS) à la fin de ton main ^^
    Bien vu je l'avais oublié, je vais le rajouter de suite

    En tout cas merci pour vos réponse, elles m'ont bien aidé
    Je repars me plonger dans la suite de mon projet

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pouet_forever :
    Pour passer une fonction en paramètre il faut utiliser le & (&compare).
    Ce n'est pas une obligation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trier un tableau en utilisant qsort
    Par IngenieurElec dans le forum Débuter
    Réponses: 5
    Dernier message: 23/11/2012, 15h03
  2. utilisation de qsort et bsearch
    Par hitchie dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 24/01/2008, 16h45
  3. utiliser qsort avec void**
    Par dj.motte dans le forum C
    Réponses: 24
    Dernier message: 04/02/2007, 09h05
  4. Utilisation de la fonction qsort
    Par Jsmeline dans le forum C
    Réponses: 8
    Dernier message: 28/01/2005, 12h40
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo