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

SL & STL C++ Discussion :

Problème : Fonction qui mélange un tableau passé en paramètre


Sujet :

SL & STL C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut Problème : Fonction qui mélange un tableau passé en paramètre
    Salut tout le monde,

    dans le cadre d'un mini projet pour accélérer dans le monde du C++,
    je cherche à créer une fonction melangeant les élements d'un tableau.
    La fonction Appelée Mafonction contient deux paramètres :
    un tableau d'objet (trié) et un entier déterminant sa taille


    voila mon idée

    fichier.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    class MaClasse
    {
      ...
      void Mafonction(Objet[] , const int &);
      ...
    };

    fichier.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Mafonction(Objet t[] , const int x)
    {
      std::random_shuffle(t,t+x);
    }
    Ce bout de code ne marche pas et génère une erreur

    Ce que jeux savoir :

    -Est ce que random_shuffle permet de melanger des tableaux d'objets? (une documentation si c'est possible)

    -Est ce que le passage d'un tableau en paramètre se fait par valeur ou par adresse ? (puisque le tableau en paramètre doit être mélangé et non pas une copie de lui, donc je dois obtenir comme resultat un tableau melangé)

    -Mon Code est il correcte ? Que dois je faire pour le faire fonctionner sachant que je suis obligé d'utiliser random_shuffle() dans ma fonction ?

    en utilisant directement random_shuffle() dans le main je n'obtient aucune d'erreur

    PS : Je suis débutant en C++ et obligé ainsi d'utiliser DevC++ (dans sa dérnière version).

    Merci de me repondre c'est urgent.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par LePassager Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    class MaClasse
    {
      ...
      void Mafonction(Objet[] , const int &);
      ...
    };

    fichier.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Mafonction(Objet t[] , const int x)
    {
      std::random_shuffle(t,t+x);
    }
    Ce bout de code ne marche pas et génère une erreur
    Quelle erreur ? Je vois entre autre un probème entre la déclaration qui passe un int par référence, mais la définition qui le passe par copie.
    Citation Envoyé par LePassager Voir le message
    -Est ce que random_shuffle permet de melanger des tableaux d'objets? (une documentation si c'est possible)
    Oui, à condition qu'il arrive à déplacer des objets. Ne conaissant pas ta classe objet, dificile à dire si c'est le cas.
    Citation Envoyé par LePassager Voir le message
    -Est ce que le passage d'un tableau en paramètre se fait par valeur ou par adresse ? (puisque le tableau en paramètre doit être mélangé et non pas une copie de lui, donc je dois obtenir comme resultat un tableau melangé)
    En fait, malgré l'écriture trompeuse, on ne passe jamais un tableau à une fonction, mais plutôt un pointeur à son premier élément.
    Citation Envoyé par LePassager Voir le message
    -Mon Code est il correcte ? Que dois je faire pour le faire fonctionner sachant que je suis obligé d'utiliser random_shuffle() dans ma fonction ?
    Le code serait plus simple en utilisant des conteneurs de la STL plutôt qu'un tableau, on se poserait moins de question.

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Edit : grillé par Loïc..
    Citation Envoyé par LePassager Voir le message
    -Est ce que random_shuffle permet de melanger des tableaux d'objets?
    Oui. Il permet de mélanger tout ce qui ressemble de près ou de loin à une séquence d'objet (tableau, chaine de caractère, vecteur, liste)

    (une documentation si c'est possible)
    Ben ici http://tinyurl.com/9q62hc

    -Est ce que le passage d'un tableau en paramètre se fait par valeur ou par adresse ?
    Bon, ça c'est une bonne question. Contrairement à... mmm tout le reste, le passage de tableau se fait toujours par adresse, ce qui est sacrement déroutant. Malheureusement c'est un héritage d'une bizarrerie du C auquel on n'y peut rien. Je te conseille de travailler avec les std::vector, l'équivalent c++ des tableaux, pour avoir la syntaxe habituelle.
    f(vector<Ovject> vec) passe par valeur, et fait une copie locale du vecteur pour la fonction et f(vector<Object>& vec) passe par référence, donc modifie le vecteur passé en paramètre.

    -Mon Code est il correcte ?
    A priori oui.
    Un exemple minimale qui compile donne ça :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include "time.h"
     
    class Object
    {
    public:
    	Object() : member_(0){}
    	Object(int member) : member_(member){}
    	void Print(){std::cout << member_ << std::endl;} 
    private:
    	int member_;
    };
     
    void Shuffle(Object t[] , const int size) 
    {
      std::random_shuffle(t, t + size);
    }
     
    int main()
    {
    	srand(time(0)); // initialise lle générateur aléatoire
    	const int size = 3;
    	Object tab[size];
            tab[0] = Object(1);
            tab[1] = Object(2);
            tab[2] = Object(3);
    	Shuffle(tab, size);
    	for(int i = 0; i < size; i++)
    	{
    		tab[i].Print();
    	}
    	return 0;
    }
    Et avec un vecteur :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include "time.h"
     
    class Object
    {
    public:
    	Object() : member_(0){}
    	Object(int member) : member_(member){}
    	void Print(){std::cout << member_ << std::endl;} 
    private:
    	int member_;
    };
     
    void Shuffle(std::vector<Object>& vec) 
    {
      std::random_shuffle(vec.begin(), vec.end());
    }
     
    int main()
    {
    	srand(time(0)); // initialise lle générateur aléatoire
    	std::vector<Object> vec;
    	vec.push_back(Object(1));
            vec.push_back(Object(2));
            vec.push_back(Object(3));
     
    	Shuffle(vec);
    	for(size_t i = 0; i < vec.size(); i++)
    	{
    		vec[i].Print();
    	}
    	return 0;
    }

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    ...
    Tout d'abord je tiens a vous remercier,

    l'idée de passer le int par reference et constant et juste pour signaler a la fonction que ce parametre doit etre utilisé tel quel sans modifcation et sans créer une copie
    ----------------------------------------------------------------------
    pour le passage d'un pointeur sur le premier element du tableau, vous avez tout a fait raison
    ----------------------------------------------------------------------

    je dois creer un jeu de carte

    une carte contient deux int (valeur et symbole)
    la fonction shuffle_random va me permettre de melanger les cartes aleatoirement (tableau de cartes)---> c'est packet de carte (classe a part entiere) qui fera appel a shuffle_random

    en ce qui concerne la STL :je connais pas grand chose pour le moment
    cela m'interesse ! j'attends vos conseils

    et merci infiniment

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Arzar Voir le message
    ...[/code]
    Je vous remercie ^^ pour votre exemple et pour la doc^^

    j'ai bien saisi et enregistré en memoire vos infos

    super ! merci

    donc, vaut mieux travailler avec des vecteurs que des tableaux

    je dois alors refaire toutes les classes que j'ai créé pour l'adopter avec les vecteurs

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    j'ai une question concernant la STL :

    en utilisant les algorithmes sort, shuffle_rand....est que pour mon cas (objet carte (int,int) dois-je effectuer une surcharge d'operateurs pour que le tris et le melange se font correctement puisque je compare par valeur seulement ? si oui les quels ?

    je pense pour sort je dois surcharger l'operateur de comparaison '<'

    et encore un big grand merci

    vous etes les meilleurs

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par LePassager Voir le message
    je pense pour sort je dois surcharger l'operateur de comparaison '<'
    Soit faire ça, soit au moment du sort indiquer comment il doit considérer la comparaison entre deux éléments.

    La solution dépend si tes éléments ont un ordre naturel, ou bien si l'ordre en question n'est valide que pour ce sort en particulier.

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Soit faire ça, soit au moment du sort indiquer comment il doit considérer la comparaison entre deux éléments.

    La solution dépend si tes éléments ont un ordre naturel, ou bien si l'ordre en question n'est valide que pour ce sort en particulier.
    c'est compris monsieur

    merci beaucoup

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/04/2009, 13h42
  2. Réponses: 4
    Dernier message: 18/09/2007, 10h46
  3. Réponses: 11
    Dernier message: 14/10/2006, 21h26
  4. Fonction qui renvoie un tableau?
    Par elm dans le forum C
    Réponses: 23
    Dernier message: 21/12/2005, 12h44
  5. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06

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