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 :

passer membres d'une structure comme parametres


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [delestage] passer membres d'une structure comme parametres
    Bonjour!
    je voudrais trier un tableau de structure, et pouvoir faire ce tri en fonction de differents membres de ma structure, en passant le membre en question en tant que parametre dans l'appel de ma fonction.

    j'ai essaye de mettre en parametre
    (structure.donnee_selon_laquelle_je_veux_trier, .....)
    et
    (structure[].donnee_selon_laquelle_je_veux_trier, .....)

    c'est une fonction template qui accepte un tableau de donnees de type T en parametre.
    tout ca ne marche pas... Comment est-ce que je dois ecrire ca?

    (j'utilise dev c++ sous windows XP)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Redefinit l'operateur de comparaison (< ou >, selon ce que tu utilise pour trier) de ta structure, et fait lui comparer le champs que tu veux.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    je suis peut etre pas tres clair, j'aurais du mettre 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
     
    void trier(Personne pers[], int nbPers)
    { 
    	int i, j, indMin;
     
       	for (i = 0; i < nbPers-1 ; i++)
    	{   indMin = i;
    		for (j = i+1; j < nbPers ; j++)
    			   if ( pers[j].numero < pers[indMin].numero )
    				      indMin = j;
     
    		if (indMin != i)
    		{ 
    			permuter(pers[i], pers[indMin]);
    		}
    	}
     
    }
    comme ca ca marche, mais je trie seulement selon les numero des personnes, si je veux changer je dois retaper tout l'algorithme.

    en fait j'aimerais arriver a un truc qui ressemble a ca :
    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
     
    template <class T>
    void trier(T tableau[], int nbPers)
    { 
    	int i, j, indMin;
     
       	for (i = 0; i < nbPers-1 ; i++)
    	{   indMin = i;
    		for (j = i+1; j < nbPers ; j++)
    			   if ( tableau[j] < tableau[indMin] )
    				      indMin = j;
     
    		if (indMin != i)
    		{ 
    			permuter(pers[i], pers[indMin]);
    		}
    	}
     
    }
    et le contenu de mon tableau serait par exemple pers[].taille ou n'importe quoi d'autre....

  4. #4
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Et quelle est l'erreur?
    Sinon moi je préfère utiliser typename pour les templates...

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu devrais plutôt utiliser la fonction standard std::sort + des foncteurs.

    http://c.developpez.com/faq/cpp/?pag...TL_custom_sort

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    le probleme c'est quand j'appelle ma fonction, dans la premiere version je fais :

    trier (pers, nbPers);

    dans la deuxieme je pensais a un truc du genre :

    trier (pers.taille, nbPers);

    je suppose qu'il faut aussi que je lui passe pers, pour la permutation apres, mais dans les deux cas j'ai :
    " request for member `taille' in `pers', which is of non-class type `Personne[20]' )

    (et je ne veux pas utiliser std::sort parceque c'est un exercice..... )

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu souhaites vraiment pouvoir transmettre à ta fonction le membre sur lequel effectuer le tri, je ne vois pas trop d'alternative au système de foncteur utilisé par la STL. Ca paraît la meilleure solution.

    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
    template <class T, class F>
    void trier(T tableau[], size_t taille, F func)
    {
        ...
     
        if (func(tableau[j], tableau[indMin]))
     
        ...
    }
     
    struct TrierPersonnesSelonAge
    {
        bool operator ()(const Personne& p1, const Personne& p2) const
        {
            return p1.age < p2.age;
        }
    };
     
    Personne tab[20];
    trier(tab, 20, TrierPersonnesSelonAge());

Discussions similaires

  1. Réponses: 9
    Dernier message: 11/01/2010, 10h30
  2. passer une classe comme parametre d'une fonction
    Par antoine dpt dans le forum VBA Access
    Réponses: 2
    Dernier message: 10/07/2009, 13h10
  3. initialiser les membres d'une structure
    Par molesqualeux dans le forum C
    Réponses: 8
    Dernier message: 02/02/2006, 19h57
  4. Réponses: 12
    Dernier message: 25/01/2006, 07h29
  5. passer l'adresse d'un membre d'une structure ?
    Par tintin72 dans le forum C
    Réponses: 6
    Dernier message: 27/12/2005, 12h20

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