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 :

Tri d'une structure


Sujet :

C

  1. #1
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut Tri d'une structure
    Bonjour,

    Je dispose d'une structure Fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct
    {
    	char *nom;
    	char type;
    	off_t taille;
    	time_t modif;
    } Fichier;
    J'utilise cette structure pour stocker la liste de mes fichiers et dossier. Je dispose pour l'instant de deux pointeurs de Fichier ( un pour les dossiers et l'autre pour le reste ). J'aimerai savoir s'il était possible de trier ces pointeurs par leur nom ( modifier les pointeurs en conséquence ), mais je ne sais pas si c'est possible, et surtout par ou commencer.

    d'avance
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par buchs
    J'aimerai savoir s'il était possible de trier ces pointeurs par leur nom ( modifier les pointeurs en conséquence ), mais je ne sais pas si c'est possible, et surtout par ou commencer.

    d'avance
    Euh.. Tu veux dire trier ces structures ??

    Tu peux, mais tu as fait un tableau de structures ? ou une liste ?

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    En fait, je dispose de deux pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Fichier *dossiers;
    Fichier *autre;
    Chacun de ces pointeurs est un tableau, un ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dossiers[0]={"..",'d',UnTemps}
    dossiers[1]={"tmp",'d',UnAutreTemps}
    etc.
    J'aimerai pouvoir trier ces pointeurs d'après leurs noms. En espérant avoir été plus clair cette fois ci
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ben tu peux faire un qsort, et ta fonction de tri comparera les noms :

    return strcmp(elet1->nom, elt2->nom)

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Si j'utilise qsort sur le nom de mes pointeurs, ça me changera aussi le reste, ou juste la liste des noms?

    En fait, si ça me trie juste les noms et me laisse le reste intact, ou j'ai les entrées de la structure qui bouge avec?

    Etat initial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dossiers[0]={"tmp",'d',TEMPS1}
    dossiers[1]={"Desktop",'d',TEMPS2}
    L'état final sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dossiers[0]={"Desktop",'d',TEMPS2}
    dossiers[1]={"tmp",'d',TEMPS1}
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dossiers[0]={"Desktop",'d',TEMPS1}
    dossiers[1]={"tmp",'d',TEMPS2}
    ??

    pour les réponses apportées.

    P.S: j'ai pas compris ce que je dois faire de ton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return strcmp(elet1->nom, elt2->nom)
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    fait un man qsort....


    En gros le qsort trie n'importe quel tableau, mais on doit lui fournir une routine de tri, qui sera appelée par l'algo de tri avec 2 éléments du tableau.

    Cette routine doit sortir un nombre négatif si l'élément 1 doit être considéré avant l'élt. 2, positif dans le cas contraire, et 0 si ils sont équivalents.

    Donc, dans ton cas, la comparaison se faisant sur les noms, tu passeras en paramètres tableau à qsort ton tableau , le nombre d'éléments, et une adresse de fonction de tri. Dans cette fonction, chacun des paramètres sera un élément de ton tableau (dossier[0], dossier[1] par exemple). Donc là tu fera ton strcmp sur les noms. Et ça te ressortira l'ensemble du tableau trié....

  7. #7
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Voici ce que j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Fichier* tri_fichier(Fichier *liste, int taille)
    {
    //[...]
    qsort(dossier, taille, sizeof(Fichier *), (struct Fichier) compare);
    //[...]
    }
    int compare(Fichier *f1, Fichier *f2)
    {
    	return strcmp(f1->nom, f2->nom);
    }
    J'ai une erreur sur la ligne du qsort:
    conversion to non-scalar type requested
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    lit la doc...

    Il faut passer par des pointeurs void *, dans la routine de tri.. Elle ne peut pas savoir ce que c'est des types fichiers ....

    Ce doit être des pointeur void * sur des éléments du tableau... Que donc il faur recaster à l'intérieur de la routine de tri..

  9. #9
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Merci le tri marche comme sur des roulettes

    Bon week-end de Pâques
    ++
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

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

Discussions similaires

  1. Tri sur une structure
    Par darkwall_37 dans le forum Débuter
    Réponses: 1
    Dernier message: 09/03/2010, 13h39
  2. Tri à bulle sur les membres d'une structure
    Par Jérôme.O[76] dans le forum C++
    Réponses: 3
    Dernier message: 02/10/2008, 14h29
  3. Tri d'une structure avec ptr sur void
    Par badack dans le forum C
    Réponses: 6
    Dernier message: 12/04/2007, 11h17
  4. TRI d'une structure à partir des noms
    Par jeff69 dans le forum C
    Réponses: 12
    Dernier message: 26/08/2006, 20h20
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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