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 :

changer la valeur d'un objet Int32


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 30
    Points
    30
    Par défaut changer la valeur d'un objet Int32
    Bonjour,

    Comment peut on faire pour changer la valeur contenue dans un objet de type Int32, je pensais que cela était simple mais je n'ai rien trouvé par moi même ou dans les docs.

    Je voudrais faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                object monObjInt = 5;
                object pointeurSurMonInt = monObjInt;
                pointeurSurMonInt = -10;
                Console.WriteLine(monObjInt);//affiche 5, je voudrais -10
    Le 5 affiché me parait normal, je déférence pointeurSurMonInt en le faisant pointer sur un autre objet.

    Pour empecher cela, est ce qu'il y a quelque chose du type suivant qui existe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                object monObjInt = 5;
                object pointeurSurMonInt = monObjInt;
                pointeurSurMonInt.Value = -10; //ce qu'il pourrait marcher mais...le .Value n'existe pas
                Console.WriteLine(monObjInt);//devrait afficher 10

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Int32 est un type intégral et non un type référence.
    Qu'est ce que tu voudrais faire exactement ?
    Si c'est pour passer la variable par référence dans une méthode, tu peux utiliser ref ou out dans la déclaration de la méthode en question.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Idem, je ne comprends pas ce que tu veux faire.

    Pourquoi utiliser le type generique objet pour stocker un entier ?

    C'est pas clair ta demande.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 30
    Points
    30
    Par défaut
    Je voudrais pouvoir avoir deux variables différentes qui correspondent au meme entier.

    Ainsi quand je change la valeur d'une des deux variable, l'autre est aussi changée, genre je voudrais avoir une sorte de type référence pour les entiers. Je suis peut etre pas clair...

  5. #5
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Peut - être en mode unsafe

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
             unsafe
                {
                    int x = 10;
                    int* y = &x;
     
                    System.Console.WriteLine(*y);
                }
    Mehdi Feki : Modérateur .Net

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par mehdi_tn
    Peut - être en mode unsafe
    Certes, mais on en revient au problème de son besoin, que je ne comprends pas.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  7. #7
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par duaner
    Je voudrais pouvoir avoir deux variables différentes qui correspondent au meme entier.
    L'intéret est ou ?

    Citation Envoyé par duaner
    Ainsi quand je change la valeur d'une des deux variable, l'autre est aussi changée, genre je voudrais avoir une sorte de type référence pour les entiers. Je suis peut etre pas clair...
    Ben tu encapsules :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class MonInt32
    {
        private int i;
     
        public int Value
        {
             get { return i; }
             set { i = value; }
        }
    }
    et tu utilises MonInt32 à la place ...

    n'empeche que je suis comme les autres je comprend pas le besion la ...
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 30
    Points
    30
    Par défaut
    Je vais essayer d'être plus complet et plus clair sur ce que je veux faire :

    J'ai des fonctions qui agissent sur une liste d'input :
    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
        //classe travaillant sur des inputs
        public abstract class ATraiteur
        {
            //liste des objets sur lesquels la classe travaille
            //la string est l'alias utilisé dans les fonctions de traitement et l'objet et l'objet surlekel on travail
            protected Dictionary<string, Object> _inputs = new Dictionary<string, object>();
     
            //une fonction de traitement
            public abstract void action(); 
     
            //ajout d'un objet sur lequel la classe pourra travailler
            public void addInput(string alias, object newInput)
            {
                _inputs.Add(alias, newInput);
            }
        }
    Ces fonctions ne connaissent leurs inputs que via un alias, une implémentation de cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        //une implémentation de ATraiteur
        public class traiteur1 : ATraiteur
        {
            public override  void action()
            {
                //il faut que _inputs contienne les entrées objectInt32 et objectMonInt32
                _inputs["objectInt32"] = 0;
                ((MonInt32)(_inputs["objectMonInt32"])).Value = 0;
            }
        }
    et voici ce que je veux faire :
    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
            static void Main(string[] args)
            {
                //creation des objets sur lesquels les fonctions traiteurs vont travailler
                int intNormal = 5;
                MonInt32 objMonInt32 = new MonInt32(5);
     
                //creation d'une fonction traiteur et liaison avec les objets précédemment créés
                traiteur1 t1 = new traiteur1();
                t1.addInput("objectInt32", intNormal);
                t1.addInput("objectMonInt32",objMonInt32);
     
                //traitement
                t1.action();
     
                //fin du traitement
                Console.WriteLine("intNormal : " + intNormal + ", objMonInt32 : " + objMonInt32.Value);
            }
        }
    Console.WriteLine("intNormal : " + intNormal + ", objMonInt32 : " + objMonInt32.Value); affiche 5 et 0, je voudrais 0 et 0.

    En faite, mes objets ATraiteur doivent travailler sur les mêmes inputs, ainsi si traiteur1 modifie l'objet objMonInt32 du programme principal alors traiteur2 (si il esixtait) devrait travailler sur la nouvelle valeur de objMonInt32.

    Quand on a des objets avec des champs, il n'y a pas de probleme mais dans traiteur 1 quand je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _inputs["objectInt32"] = 0;
    c'est comme si je faisais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _inputs["objectInt32"] = new Int32(0);
    En passant par un objet monInt32 il n'y a pas de problème puis que je change la valeur d'un champ, je ne crée pas un nouvel objet.

    Je voudrais pouvoir faire cela sans la classe monInt32, je pensais qu'il y avait une méthode pour changer la valeur d'un int genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i;
    i.Value = 3;
    ou i.set(3);
    J'espère que je me suis mieux exprimé...

  9. #9
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par duaner
    J'espère que je me suis mieux exprimé...
    oui tu t'es mieux exprimé mais ce que tu ne comprend toujours pas c'est que quant tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int i = 0;
    int j = i;
    C'est bien la valeur de i qui est copié dans j et non pas la référence. Tu ne peux donc pas pas faire ce que tu veux sans passer par une encapsulation
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  10. #10
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Juste une question, tu traite toujours des entiers dans les valeurs de ton dictionnaire ?
    Mehdi Feki : Modérateur .Net

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 30
    Points
    30
    Par défaut
    mehdi_tn>non, mon dictionnaire contient toute sorte d'objets, des entiers, des strings et des objets d'autre classes que j'ai implémentées

    dev01>Oui d'où mon problème...j'aurais aimé ne pas passer par une encapsulation. Je pensait qu'il y avait quelquechose de natif enC# qui faisait cela.

  12. #12
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Tu vas donc avoir des méthodes action pour chaque type ?
    Mehdi Feki : Modérateur .Net

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 30
    Points
    30
    Par défaut
    Dans mes méthodes actions, je suis obligé de toujours caster, chaque classe implémentant ATraiteur connais ses inputs et dans le programme principal il faut que ces inputs soit bien du type spécifié ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public class UneClasse
        {
            private int _id;
            private int _value;
     
            public void m1(int i)
            {
               ...
        }
    exemple d'action
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public class unTraiteur : ATraiteur
        {
            public override void action()
            {
                //il faut que _inputs contienne l'entrée obj1
                ((UneClasse)(_inputs["obj1 "])).Value = 0; //je suis obliger de caster
                ((UneClasse)(_inputs["obj1 "])).m1(-42);
            }
        }
    programme principal :
    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
     
            //fonction correcte
            static void Main(string[] args)
            {
                UneClasse c = new UneClasse();
                ATraiteur t = new unTraiteur();
                t.addInput("obj1",c); //ajout de obj1
     
                t.action();//action va fontion correctement
             }
     
     
            //fonction incorrecte
            static void Main2(string[] args)
            {
                int c = 5;
                ATraiteur t = new unTraiteur();
                t.addInput("obj1",c); //ajout de obj1
     
                t.action();//va planter lors du cast
             }
    En faite si je fait comme cela, c'est pour rester très générique dans la déclaration de ATraiteur et en plus mon dictionnaire ne contient pas forcément que des objets du meme type

  14. #14
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Je ne vois toujours pas comment ton action sait qu'il possede une clé obj1

    Sinon pour faire plus propre, est-ce que t'as pensé aux generics ?

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     public class TraiteurGeneric<T>
            {
                private Dictionary<string, T> _inputs = new Dictionary<string, T>();
     
                public void addInput(string alias, T newInput)
                {
                    _inputs.Add(alias, newInput);
                }
            }

    Ca ne veut pas dire que ça résourd pas ton problème intial mais ça permet d'éviter les casts.
    Mehdi Feki : Modérateur .Net

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 30
    Points
    30
    Par défaut
    Je ne vois toujours pas comment ton action sait qu'il possede une clé obj1
    Et bein elle n'en sait rien, action espère que dans le programme principal il y a eu un addInput("obj1",o1); avec o1 du bon type...

    Je n'utilise pas la généricité car il peut y avoir des objets de type différents dans le dictionnaire

  16. #16
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Là franchement je comprend plus rien. Est-ce ton code original ou tu l'ecris spécialement pour le fil ?

    Si tu mets :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class unTraiteur : ATraiteur
        {
            public override void action()
            {
                //il faut que _inputs contienne l'entrée obj1
                ((UneClasse)(_inputs["obj1 "])).Value = 0; //je suis obliger de caster
                ((UneClasse)(_inputs["obj1 "])).m1(-42);
            }
        }

    C'est que le dictionnaire de unTraiteur n'accepte que des int sinon ton code levera une exception.

    Chaque taiteur qui hérite de ATraiteur dispose de son propre dictionnaire n'est-ce pas ?
    Mehdi Feki : Modérateur .Net

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 30
    Points
    30
    Par défaut
    Là c'est mon code original (pour l'instant je regarde ce que je peux faire, après j'incorporerais à mn projet global celui ci)

    C'est que le dictionnaire de unTraiteur n'accepte que des int sinon ton code levera une exception.
    pourquoi?

    D'ailleur il n'utilise pas que des ints...


    Chaque taiteur qui hérite de ATraiteur dispose de son propre dictionnaire n'est-ce pas ?
    Oui et il est du type Dictionary<string, Object>

  18. #18
    Inscrit Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Points : 283
    Points
    283
    Par défaut
    Bonjour,

    ton analyse me parait bancale... Tu as l'air d'être dans un cas ou tu as besoin d'interface...

    Maintenant, il te reste 2 solutions:
    1. Te convaincre que tu as raison et tordre le système pour le faire marcher (méthode habituelle...)
    2. Refaire/Revalider ton analyse et voir ou ça coince...

  19. #19
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par duaner
    pourquoi?
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    ((UneClasse)(_inputs["obj1 "])).Value = 0;

    Marchera pas si à un type autre que UneClasse est affecté à obj1

    Sinon par rapport au problème initial, pense à ce que dev01 t'as recommandé. Je pensais à te recommander d'utiliser les pointeurs mais le type (int *) n'est pas convertible en object.
    Mehdi Feki : Modérateur .Net

  20. #20
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    Je suis aussi de cet avis : revois ta conception..

    Je te propose d'utiliser une interface, et pourquoi pas une classe abstraite pour les méthodes communes.

    Ainsi, tu pourra mettre tout ce que tu veux dans ton dico, en encapsulant les donnees dans une classe qui héritera de la classe abstraite.

    Peux être pourrais tu jeter un oeil aux pattern "Patron de méthode" et "Factory" (pour encapsuler aisément des types primitifs)
    Hervé Delannoy, Ingénieur études&développement.

    Je n'accepte pas les demandes de mise en relation MSN/yahoo sans motif.
    ------------------------------------------------------------------------
    Si , ni , ne peuvent vous aider, mais nous oui, pensez à un pti et au !
    Merci de vous relire
    ____________________________________________________________________________________
    Recherche joueurs de "Magic" sur Lille et environs.
    Donner plutôt que jeter.

Discussions similaires

  1. Réponses: 14
    Dernier message: 04/10/2012, 13h14
  2. [POO] Changer la source d'un objet (flash) en Javascript
    Par thomine dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/02/2008, 16h54
  3. changer la couleur d'un objet existant
    Par Mandalar dans le forum Tkinter
    Réponses: 4
    Dernier message: 02/03/2005, 21h09
  4. Changer la valeur sélectionnée d'un <select> en javasc
    Par Oluha dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/02/2005, 15h53
  5. Changer la valeur de la MTU sur un LAN
    Par nin2 dans le forum Réseau
    Réponses: 3
    Dernier message: 19/02/2005, 15h47

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