Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 06/01/2013, 14h30   #1
étudiante6
Invité de passage
 
Femme
Formateur en informatique
Inscription : 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
étudiante6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 19h05   #2
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 706
Détails du profil
Informations personnelles :
Âge : 25
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 : 1 706
Points : 4 179
Points : 4 179
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é !
Bktero est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 19h49   #3
étudiante6
Invité de passage
 
Femme
Formateur en informatique
Inscription : 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
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 "
étudiante6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 22h31   #4
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 706
Détails du profil
Informations personnelles :
Âge : 25
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 : 1 706
Points : 4 179
Points : 4 179
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é !
Bktero est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 22h36   #5
étudiante6
Invité de passage
 
Femme
Formateur en informatique
Inscription : 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
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
étudiante6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 22h57   #6
étudiante6
Invité de passage
 
Femme
Formateur en informatique
Inscription : 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
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..
étudiante6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 23h20   #7
étudiante6
Invité de passage
 
Femme
Formateur en informatique
Inscription : 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..
étudiante6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 06h36   #8
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 606
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 : 2 606
Points : 7 045
Points : 7 045
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
Bonjour,

Citation:
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 :
Citation:
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).
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 07h30   #9
plxpy
Membre émérite
 
Avatar de plxpy
 
Homme
Ingénieur
Inscription : janvier 2009
Messages : 494
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 48
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 : 494
Points : 893
Points : 893
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)
plxpy est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/01/2013, 10h13   #10
Captain'Flam
Membre habitué
 
Avatar de Captain'Flam
 
anciennement "sopsag"
Inscription : février 2011
Messages : 118
Détails du profil
Informations personnelles :
Nom : anciennement "sopsag"

Informations forums :
Inscription : février 2011
Messages : 118
Points : 138
Points : 138
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
Captain'Flam est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/01/2013, 10h37   #11
plxpy
Membre émérite
 
Avatar de plxpy
 
Homme
Ingénieur
Inscription : janvier 2009
Messages : 494
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 48
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 : 494
Points : 893
Points : 893
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.
plxpy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 11h15   #12
Captain'Flam
Membre habitué
 
Avatar de Captain'Flam
 
anciennement "sopsag"
Inscription : février 2011
Messages : 118
Détails du profil
Informations personnelles :
Nom : anciennement "sopsag"

Informations forums :
Inscription : février 2011
Messages : 118
Points : 138
Points : 138
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
Captain'Flam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 20h21   #13
Sve@r
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 495
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 : 3 495
Points : 6 604
Points : 6 604
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
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 23h32   #14
étudiante6
Invité de passage
 
Femme
Formateur en informatique
Inscription : 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 !
étudiante6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 10h49   #15
Captain'Flam
Membre habitué
 
Avatar de Captain'Flam
 
anciennement "sopsag"
Inscription : février 2011
Messages : 118
Détails du profil
Informations personnelles :
Nom : anciennement "sopsag"

Informations forums :
Inscription : février 2011
Messages : 118
Points : 138
Points : 138
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
Captain'Flam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 17h48   #16
Sve@r
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 495
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 : 3 495
Points : 6 604
Points : 6 604
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
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2013, 00h14   #17
étudiante6
Invité de passage
 
Femme
Formateur en informatique
Inscription : 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
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
étudiante6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 21h38   #18
Médinoc
Expert Confirmé Sénior
 
Avatar de Médinoc
 
Homme
Développeur informatique
Inscription : septembre 2005
Messages : 22 387
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

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

Informations forums :
Inscription : septembre 2005
Messages : 22 387
Points : 32 028
Points : 32 028
Envoyer un message via MSN à Médinoc
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.
Médinoc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2013, 22h08   #19
étudiante6
Invité de passage
 
Femme
Formateur en informatique
Inscription : 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
ç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
étudiante6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h33.


 
 
 
 
Partenaires

Hébergement Web