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 :

Problème de passage par valeur


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 66
    Par défaut Problème de passage par valeur
    Bonjour à tous,

    J'ai un problème dans mon application avec les passages par valeur d'objets de classe. À l'aide du déboggueur j'ai vu qu'en fait ma fonction modifiait le paramètre de l'appelant :

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //jtir est une variable de type Scenario_joueurs[]
    Fonction(jtir);
    //jtir a pris les valeurs de jpen
    Sachant que la fonction commence par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Fonction(Scenario_joueur[] jtir)
    {
    Scenario_joueur[] jpen = new Scenario_joueur[6];
                    int y = 0;
                    while (y < 6)
                    {
                        jpen[y] = jtir[y];
                        y++;
                    }
    }
    J'ai rajouté la variable jpen pour essayer d'éviter le problème mais ça ne change rien, ça doit etre un problème de c# que j'ai du zapper.
    Donc dans ce cas la variable jpen est créé et je met dedans la valeur de jtir.

    Dans ma fonction, jpen est modifié et se remplit avec des valeurs qui sont justes. cependant la portée de la variable jpen semble poser problème : à la fin de ma fonction tout s'est bien passé sauf que dans la fonction appelante la variable jtir contient désormais les memes valeurs que jpen alors que je ne l'ai jamais modifié.

    En clair le code se comporte comme si j'avais fait un passage par référence pourtant je ne pense pas l'avoir fait.

    Peut etre que qu'il faut faire une surcharge de l'opérateur '=' pour ma classe histoire qu'il copie chaque valeur et non l'adresse ?

    J'espère avoir exposé clairement mon problème.

    Si vous pouviez m'aider.

    Merci d'avance,

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonsoir. En somme, tu passes un tableau de références à une fonction et tu aurais voulu pouvoir modifier ces références au sein de Fonction sans que ces changements ne soient répercutés en-dehors ?

    Ceci n'est pas possible. Tu dois soit modifier le type de Scenario_joueur pour en faire un type valeur (struct) soit, d'une façon ou d'une autre, créer des clones de ces références et modifier ces clones uniquement (par exemple en surchargeant la méthode Clone() ou créant des constructeurs de copie).

    Toutefois, l'obligation de faire tout cela peut indiquer un mauvais design (pas forcément). Il serait bon que tu prennes un peu de recul, que tu fasses le point sur les responsabilités et le rôle de la classe Scenario_Joueur et les traitements opérés par Fonction afin de t'assurer que le design est correct.

    PS : En dupliquant le tableau, tu as constaté que les éléments contenus dans la copie sont toujours les mêmes que dans l'original. Le seul intérêt de dupliquer le tableau serait de pouvoir modifier cette copie (ordre des éléments, ajout ou retrait d'éléments) sans changer le tableau d'origine.
    PPS : L'opérateur d'assignation n'est pas surchargeable.

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 66
    Par défaut
    Oui c'est exactement ça.

    Et si dans Scenario_joueur je met un constructeur de copie qui prend en paramètres l'autre et assigne toutes les valeurs une par une ?

  4. #4
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Ça semble effectivement être la meilleure des solutions.
    Il suffira simplement de bien explicitement appeler le constructeur de copie.

  5. #5
    Membre chevronné

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 244
    Par défaut
    A noter que définir Scenario_joueur comme structure (struct) au lieu de classe (class) peut résoudre ce problème, mais l'utilisation de structures doit se limiter à quelques cas bien précis pour éviter de "nuire aux performances".
    Plus d'infos ici : http://msdn.microsoft.com/fr-fr/library/ms229017.aspx

Discussions similaires

  1. problème de passage de valeur dans une fonction
    Par jeremie74 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 21/09/2007, 18h30
  2. [résolut] Problème de passage de valeur entre Windows Form
    Par tribaleur dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/06/2007, 11h29
  3. [Débutant] Passage par valeur d'un objet Corba
    Par peaceinpal dans le forum CORBA
    Réponses: 1
    Dernier message: 29/05/2006, 20h15
  4. Passage par Valeur
    Par xc78370 dans le forum Langage
    Réponses: 8
    Dernier message: 20/03/2006, 23h21
  5. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 10h29

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