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 :

qsort et structure [débutant C]


Sujet :

C

  1. #1
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut qsort et structure [débutant C]
    bonjour,

    Depuis hier je me casse la tête sans trouver de solution.
    Je cherche à trier le contenu d'une structure.
    Ma structure comporte uniquement un tableau de char.
    ex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct event {
     char value[30];
    };
    J'ai réussi a trier les élément via qsort en compilant mon programme sous UNIX. Aucun problème.
    voici le code que j'utilisais sous UNIX qui fonctionne (extrait)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /* la structure */
    struct event {                 
      char value[MAX_LEN_RECORD+1];
    };                             
     
    /* la fonction de tri */
    int comp(const void *va, const void *vb) {
        const struct event *pa = va,          
                           *pb = vb;          
     return strcmp (pa->value, pb->value);    
    } 
    /* appel du tri via qsort */
      qsort(event,c,sizeof (event[0]),comp);
    Cependant je dois porter celui-ci sous z/OS (IBM). Mon problème est que je n'arrive plus à compiler....
    j'obtiens les messages suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    An object or reference of type "const event *" cannot be initialized with an expression of type "const void *".
     A parameter of type "extern "C" int (*)(const void *,const void *)" cannot be initialized with an expression of type "int (const void *, const void *)".
    The error occurred while converting to parameter 4 of "qsort(void *, size_t, size_t, extern "C" int (*)(const void *, const void *))"
    En recherchant sur le site d'IBM, j'ai trouvé un exemple pour des chaines de caractères. Cependant je n'arrive pas à adapter celui-ci afin qu'il fonctionne avec ma structure
    En fait je ne comprend pas la syntaxe qui est renvoyé par la fonction de compare de cet exemple
    Voici l'exemple fourni (que j'ai réussi à compiler sans problème):
    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
     
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    /* Declaration of compare() as a function */ 
    #ifdef __cplusplus 
    extern "C" int compare(const void *, const void *); 
    #else 
    int compare(const void *, const void *); /* macro is automatically */ #endif /* defined by the C++/MVS compiler */ 
    int main (int argc, char *argv[ ]) { 
    int i; 
    argv++; 
    argc--;
    qsort((char *)argv, argc, sizeof(char *), compare); 
    for (i = 0; i < argc; ++i) 
    printf("%s\n", argv[i]); 
    return 0; 
    } 
    int compare (const void *arg1, const void *arg2) { /* Compare all of both strings */ 
    return(strcmp(*(char **)arg1, *(char **)arg2)); }


    Pourriez vous m'aider, car là je touche le fond....

    Merci

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    An object or reference of type "const event *" cannot be initialized with an expression of type "const void *".
    Le problème doir venir de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const struct event *pa = va;
    As tu testé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const struct event *pa = (const struct event *)va;
    Pour la seconde erreur, ton compilateur tente-t-il bien de compiler en C et pas en C++ ?

  3. #3
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    MERCI pour cette réponse.

    J'ai suivi ton indication et ajouté la directive (#ifdef __cpluscplus...)
    Depuis ma compilation ne fait aucune erreur et le programme fonctionne parfaitement.

    Afin d'être sur de bien comprendre d'objet de la modification, il s'agit d'un cast du type void en type struct event .
    C'est bien ça ?
    Dernière petite question, comment expliquer cette différence entre deux environnements et deux compilateurs ?
    Mon code sous UNIX n'est pas correct au sens strict ?

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par SPACHFR Voir le message
    MERCI pour cette réponse.

    J'ai suivi ton indication et ajouté la directive (#ifdef __cpluscplus...)
    Depuis ma compilation ne fait aucune erreur et le programme fonctionne parfaitement.

    Afin d'être sur de bien comprendre d'objet de la modification, il s'agit d'un cast du type void en type struct event .
    C'est bien ça ?
    Donc ton compilateur zOS est un compilateur c++ et pas c

    Citation Envoyé par SPACHFR Voir le message
    Dernière petite question, comment expliquer cette différence entre deux environnements et deux compilateurs ?
    La différence entre deux environnement ne joue pas ici.
    La différence se situe entre un compilateur C et un compilateur C++.

    En C, il n'est pas nécessaire de caster le type void*.
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void *pv = NULL;
    int *pi = pv;
    est correct en C, pas en C++.

    De même la fonction C qsort attend comme dernier paramètre une fonction C, ce que ne peut pas être obtenu avec un compilateur c++ sans le `extern "C"` devant. (En gros, si un expert veut clarifier ce point, je suis preneur)

    Citation Envoyé par SPACHFR Voir le message
    Mon code sous UNIX n'est pas correct au sens strict ?
    Il est correct en C, mais pas en C++

  5. #5
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Merci pour l'ensemble de ces précisions.
    Je comprend maintenant pourquoi cela ne fonctionnais pas.

    J'attend un peu avant de mettre le tag résolu au cas ou quelqu'un pourrait clarifier le point que tu as soulevé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    De même la fonction C qsort attend comme dernier paramètre une fonction C, 
    ce que ne peut pas être obtenu avec un compilateur c++ sans le `extern "C"` devant. 
    (En gros, si un expert veut clarifier ce point, je suis preneur)
    Encore

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    De même la fonction C qsort attend comme dernier paramètre une fonction C, ce que ne peut pas être obtenu avec un compilateur c++ sans le `extern "C"` devant. (En gros, si un expert veut clarifier ce point, je suis preneur)
    Je ne suis pas d'accord mais je ne suis pas un expert C++.

    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
    int compare (const void *a, const void *b)
    {
        const int *ia = (const int*) a;
        const int *ib = (const int*) b;
        return *ia - *ib;
    }
     
    int main (void)
    {
        int tab[10];
     
        for (int i=0;i<10;i++)
            tab[i] = rand() % 100;
     
        qsort (tab, 10, sizeof (tab[0]), compare);
     
        for (int i=0;i<10;i++)
        {
            printf ("Here %d\n", tab[i]);
        }
     
        return 0;
    }
    compile sans aucun souci :

    ~/tmp$ g++ qsort.cpp -Wall -Wextra -O3
    ~/tmp$ ./a.out
    Here 15
    Here 21
    Here 35
    Here 49
    Here 77
    Here 83
    Here 86
    Here 86
    Here 92
    Here 93
    Ou alors j'ai loupé quelque chose.

    Ou alors on suppose que g++ n'est pas un vrai compilateur C++ :-)

  7. #7
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par fearyourself
    Ou alors on suppose que g++ n'est pas un vrai compilateur C++ :-)
    Non non c'est même un très bon compilateur C++ la preuve ton code compile sans erreurs !
    Ce qui pose problème est le cast, comme soulevé par mabu il est nécessaire en C++ mais pas en C.
    Code fearyourself : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int *ia = (const int*) a;
    const int *ib = (const int*) b;

  8. #8
    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
    Au passage tu as un beau risque d'overflow avec ta fonction compare

Discussions similaires

  1. Pointeurs sur Structure [Débutant]
    Par Kartoon67 dans le forum Débuter
    Réponses: 11
    Dernier message: 15/03/2013, 08h01
  2. [débutant]Pb de structure du programme
    Par Tymk dans le forum C++
    Réponses: 7
    Dernier message: 03/07/2008, 08h56
  3. [Débutants]Analyse structure base de données simple
    Par Serge57 dans le forum Sondages et Débats
    Réponses: 41
    Dernier message: 29/10/2007, 18h54
  4. [Débutant] Structure de projet Tomcat
    Par slclinsearch dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/12/2005, 12h30
  5. [Débutant] Modification d'une structure
    Par kyu dans le forum C++
    Réponses: 12
    Dernier message: 24/11/2005, 14h22

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