Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 19 sur 19
  1. #1
    Invité de passage
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : décembre 2012
    Messages : 11
    Points : 4
    Points
    4

    Par défaut Problème avec qsort (structure complexe)

    Bonjour,

    Après plusieurs heures de recherche toujours pas de solution, je me rends compte que je ne suis pas aussi à l'aise avec les pointeurs que je ne pensais..

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    /* 
       Un fichier a :
       - un nom 
       - un descripteur de fichier
       - un tableau de fichier ou NULL si ce n'est pas un répertoire
    */
    struct file {
      char* name;
      int fd;
      struct t_files* son;
    };
     
    /*
      un tableau de fichiers 
      - sa taille 
      - un tableau de pointeur vers des fichiers 
    */
    struct t_files {
      struct file** t;
      int size;
    };
    Je souhaite trier selon le nom, pour cela j'ai :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int struct_cmp_by_name(const void* a, const void*b ){
      struct file *ia = (struct file*)a;
      struct file *ib =  (struct file*)b;
      return strcmp(ia->name, ib->name);
    }
     
    int main(void) {
      struct t_files* res;
      /* fonction pour remplissage res (aucun problème de ce côté) */
      qsort (?, ??, ???, struct_cmp_by_name);
    }
    J'ai tenté de mettre différents paramètres sans succès.

    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de Bktero
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 524
    Points : 7 001
    Points
    7 001

    Par défaut

    Pourquoi souhaites-tu faire un tableau de structures puisque cette structure contient déjà un tableau ?
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  3. #3
    Invité de passage
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : décembre 2012
    Messages : 11
    Points : 4
    Points
    4

    Par défaut

    parce que j'en ai besoin pour stocker dedans quelques fichiers ! mais ce n'est pas ça ma question, ce que je veux savoir ,c'est comment faire le tri de " res " selon le " name "

  4. #4
    Modérateur
    Avatar de Bktero
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 524
    Points : 7 001
    Points
    7 001

    Par défaut

    Si tu veux stocker quelques fichiers dedans, pourquoi un tableau de tableaux et non simplement un tableau ? En fait, ça a à avoir avec ta question parce que le premier paramètre de qsort est le tableau à trier :
    Or, si res est un tableau de structures contenant chacune un tableau, il faut que tu lui précises laquelle ces structures il doit trier. En effet, ta fonction de comparaison compare deux fichiers, qsort te servira donc à trier un tableau de fichier. C'est le premier paramètre. Le second sera le nombre d'éléments de ce tableau (la structure le contient). Le troisième est la taille d'un élément (sizeof pourra t'aider).
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  5. #5
    Invité de passage
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : décembre 2012
    Messages : 11
    Points : 4
    Points
    4

    Par défaut

    je voudrais trier le tableau qui est dans "res " c'est à dire : res->t
    selon le champ "name", c'est pour un projet, j'utilise cette structure dans mes différentes fonctions (environ 1000 lignes de code) sans changer la structure, je peux réussir à faire appel à qsort ?


    Merci pour votre aide

  6. #6
    Invité de passage
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : décembre 2012
    Messages : 11
    Points : 4
    Points
    4

    Par défaut

    c'est la structure qui me semblait la plus évident, un tableau de fichiers c'est la taille du tableau et un pointeur vers un tableau de pointeurs, je vois Bktero ce que tu veux dire, j'ai testé la fonction qsort sur plusieurs structures plus simples, avec différentes fonctions de comparaisons pour bien comprendre mais pour lui donner le bon argument pour ma structure là c'est plus compliqué.. comment lui dire ce qui est un tableau de fichiers ? je pensais que res->t était correct, mais non..

  7. #7
    Invité de passage
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : décembre 2012
    Messages : 11
    Points : 4
    Points
    4

    Par défaut Simplification de la structure

    Je viens de finir de corriger les erreurs, je ne savais pas que mon struct file** t était inutile, y a t'il une différence ?

    Code :
    1
    2
    3
    4
    5
     
    struct t_files {
      struct file* t;
      int size;
    };
    j'ai donc fais appel à
    Code :
    1
    2
     
    qsort (res->t, sizeof res->t / sizeof *res->t, sizeof *res->t, struct_cmp_by_name);
    mais le tableau n'était pas trié, en cherchant j'ai trouvé que

    Code :
    1
    2
     
        printf("%d\n", sizeof res->t / sizeof *res->t);
    donnait 0 sauf erreur de ma part, un problème dans les arguments..

  8. #8
    Responsable Sécurité

    Avatar de Neckara
    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 443
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 443
    Points : 12 845
    Points
    12 845

    Par défaut

    Bonjour,

    void qsort (void *base, size_t nmemb, size_t size,

    int (*compar)(const void *, const void *));
    base = ton tableau
    nmemb = nombre d'élément
    size = taille d'un élément
    compar = pointeur sur une fonction de comparaison d'élément.

    Donc :
    qsort (res->t, res->size, sizeof *res->t, struct_cmp_by_name);
    Ne pas oublier qu'un sizeof d'un pointeur donne la taille du pointeur (4 pour architecture 32 bits).
    On dit "bibliothèque" pas "librairie" !

    Ma page DVP : http://neckara.developpez.com/

  9. #9
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur
    Inscrit en
    janvier 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : janvier 2009
    Messages : 561
    Points : 1 020
    Points
    1 020

    Par défaut

    Une remarque sur la forme mais qui me parait essentielle surtout si - je me base sur ton statut "formateur en informatique" - tu prépares un cours.

    Mettre, même en commentaire, :

    Code :
    1
    2
    3
    4
    5
    /*
      un tableau de fichiers 
      - sa taille 
      - un tableau de pointeur vers des fichiers 
    */
    pour enchainer de suite sur (je me contrefiche de la double *)

    Code :
    1
    2
    3
    4
    struct t_files {
      struct file** t;
      int size;
    };
    c'est-à-dire la définition d'une structure est à bannir (sauf à vouloir faire grossir les rangs, déjà bien fournis, des posteurs du forum C qui mélangent tout)

  10. #10
    Membre actif
    Avatar de Captain'Flam
    Profil pro anciennement "sopsag"
    Inscrit en
    février 2011
    Messages
    154
    Détails du profil
    Informations personnelles :
    Nom : anciennement "sopsag"

    Informations forums :
    Inscription : février 2011
    Messages : 154
    Points : 173
    Points
    173

    Par défaut

    Bonjour étudiante6, je trouve que tu te compliques un peu la vie avec tes structures et autres **.
    Voici une petite version "simplifiée" :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    typedef struct
        {
        const char * name ;
        int fd ;
        } file ;
     
    int struct_cmp_by_name ( const void * a, const void * b )
        {
        file *ia = (file*)a ;
        file *ib = (file*)b ;
        return strcmp( ia->name,ib->name ) ;
        }
     
    void foo ( void )
        {
        file t [5] = {{ "le",5 },{ "petit",6 },{ "chat",8 },{ "est",45 },{ "mort",51 }} ;
        qsort( t,5,sizeof( file ),struct_cmp_by_name ) ;
        }
    La fonction foo te montre qu'on peut se passer de t_files.
    De plus, n'oublie pas qu'en C (!= C++) typedef struct permet d'éviter de rajouter struct devant chaque utilisation du type.

    plxpy, je ne suis pas sûr de comprendre le sens de ta remarque :
    Tu veux dire que c'est mal d'annoncer qu'on va déclarer un tableau et de finalement déclarer une structure ?
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven 64 / Visual 2010 / Python 2.7 / Eclipse

  11. #11
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur
    Inscrit en
    janvier 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : janvier 2009
    Messages : 561
    Points : 1 020
    Points
    1 020

    Par défaut

    Citation Envoyé par Captain'Flam
    Tu veux dire que c'est mal d'annoncer qu'on va déclarer un tableau et de finalement déclarer une structure ?
    C'est exactement ça.

  12. #12
    Membre actif
    Avatar de Captain'Flam
    Profil pro anciennement "sopsag"
    Inscrit en
    février 2011
    Messages
    154
    Détails du profil
    Informations personnelles :
    Nom : anciennement "sopsag"

    Informations forums :
    Inscription : février 2011
    Messages : 154
    Points : 173
    Points
    173

    Par défaut

    Alors je suis super d'accord avec toi !
    Il vaut mieux pas de commentaire du tout qu'un commentaire qui ne correspond pas !
    Ex : copier/coller d'une déclaration + modification de la déclaration + commentaire pas mis à jour
    --> au bout de quelques cas de ce genre, et tu ne sais plus ce qu'il faut croire : le code (qui peut être buggé) ou le commentaire.
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven 64 / Visual 2010 / Python 2.7 / Eclipse

  13. #13
    Expert Confirmé Sénior
    Avatar de Sve@r
    Homme Profil pro Frédéric
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    4 151
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric
    Âge : 45
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 4 151
    Points : 9 029
    Points
    9 029

    Par défaut

    Citation Envoyé par étudiante6 Voir le message
    Je viens de finir de corriger les erreurs, je ne savais pas que mon struct file** t était inutile, y a t'il une différence ?

    Code :
    1
    2
    3
    4
    struct t_files {
      struct file* t;
      int size;
    };
    Bonsoir
    Oui il y a une différence. Là tu déclares une structure apte à gérer un tableau de "struct file" donc un tableau de fichiers selon ta conception. Alors qu'au premier coup, tu déclarais une structure apte à gérer un tableau de pointeurs, chaque pointeur pouvant, lui, être le début d'un tableau. Donc pour simplifier tu avais créé une structure faite pour gérer un tableau de tableaux (ce qui est la représentation C d'un tableau 2D).
    En l'état, ton nouveau code est mieux construit et cohérent avec ton problème. Toutefois, si tu prenais de suite l'habitude de nommer tes structures "s_" et tes types "t_" cela te simplifierait la relecture (et à nous aussi) de ton code et éviterait de confondre "file" (le type) et "file" (le fichier)...
    Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
    Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
    Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
    Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
    Dr. Adrian Rogers, 1931

  14. #14
    Invité de passage
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : décembre 2012
    Messages : 11
    Points : 4
    Points
    4

    Par défaut Remerciments

    Merci à tous ! Ca n'a jamais été un si grand bonheur de voir le résultat d'un tri !
    Encore plus que si je l'avais écris moi même pour vous dire.
    Et puis vos explications sont très clairs, j'ai très bien compris, je ne pouvais imaginer que le problème venait de ma structure !


    Au-delà de l'erreur au niveau du commentaire lui même, il ne faut jamais mettre de commentaire à une structure si je comprends bien ?
    C'est vrai pour le typedef struct, merci !

    Sve@r par contre je ne suis pas sûre d'avoir compris pour la convention, pour moi le "t_" était pour tableau, donc quand c'est pour une structure la convention veut qu'on commence par "s_" ?

    Merci donc à Captain'Flam, Sve@r, plxpy, Neckara, Bktero[/B] pour votre temps !

  15. #15
    Membre actif
    Avatar de Captain'Flam
    Profil pro anciennement "sopsag"
    Inscrit en
    février 2011
    Messages
    154
    Détails du profil
    Informations personnelles :
    Nom : anciennement "sopsag"

    Informations forums :
    Inscription : février 2011
    Messages : 154
    Points : 173
    Points
    173

    Par défaut

    Citation Envoyé par étudiante6 Voir le message
    il ne faut jamais mettre de commentaire à une structure si je comprends bien ?
    Arrrrgl !
    Bien sûr que siiiii ! il faut mettre des commentaires !
    Il n'y a jamais rien à quoi il ne faille pas mettre de commentaire.
    (hum... pas très claire cette phrase...)

    Le règle c'est que le commentaire DOIT correspondre au code.
    Mais, au pire, il vaut mieux pas de commentaire du tout plutôt qu'un commentaire qui ne correspond pas.
    Si il n'y a pas de commentaire, le lecteur va chercher à comprendre en lisant le code. C'est pas sympa pour lui, mais il devrait finir pas s'en sortir.
    Si le commentaire ne correspond pas, il va le lire, le croire vrai et ne comprendra plus rien à ce qui suit. Et là c'est vraiment affreux

    Quand on modifie son code, il faut penser à mettre à jour le commentaire.
    C'est un service que l'on rend au lecteur mais aussi à soi-même car on est souvent le lecteur de son propre code.
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven 64 / Visual 2010 / Python 2.7 / Eclipse

  16. #16
    Expert Confirmé Sénior
    Avatar de Sve@r
    Homme Profil pro Frédéric
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    4 151
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric
    Âge : 45
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 4 151
    Points : 9 029
    Points
    9 029

    Par défaut

    Citation Envoyé par étudiante6 Voir le message
    Sve@r par contre je ne suis pas sûre d'avoir compris pour la convention, pour moi le "t_" était pour tableau, donc quand c'est pour une structure la convention veut qu'on commence par "s_" ?
    Yep. Exemple
    Code c :
    1
    2
    3
    4
    typedef struct s_file {
        char *nom;
        int size;
    } t_file;
    Comme ça, la chaine "file" est disponible pour nommer une variable qui sera du type... t_file
    Code c :
    1
    2
    t_file file1, file2, file3;
    void traitement(t_file *file)

    Pour les tableaux je ne pense pas qu'il y ait de convention particulière mais préfixer un tableau avec "tab_" me parait assez sensé...

    PS: donner un nom propre à la structure (ici "s_file") n'est pas utile ici puisque ce nom n'est jamais réutilisé. C'était juste pour l'exemple...
    Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
    Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
    Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
    Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
    Dr. Adrian Rogers, 1931

  17. #17
    Invité de passage
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : décembre 2012
    Messages : 11
    Points : 4
    Points
    4

    Par défaut

    Merci, pas de soucis pour les commentaires j'essayerai d'en mettre un maximum ! (et qui correspondent au code)

    C'est noté pour les noms de structures merci

    bonne soirée à tous

  18. #18
    Expert Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    23 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 23 607
    Points : 34 993
    Points
    34 993

    Par défaut

    Au passage: essayez d'éviter le Franglais quand les mots veulent dirent deux choses différentes selon la langue (ici, "file"): Il vaut mieux mettre tous les champs de la structure en anglais pour éviter la confusion...
    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.

  19. #19
    Invité de passage
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : décembre 2012
    Messages : 11
    Points : 4
    Points
    4

    Par défaut

    ça m'étonne de moi donc j'ai vérifié et ce n'est pas moi, regarde ma première version

    Code :
    1
    2
    3
    4
    5
    struct file {
      char* name;
      int fd;
      struct t_files* son;
    };
    mais je suis d'accord mélanger anglais et français ce n'est pas très agréable

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •