Partage
  • Partager sur Facebook
  • Partager sur Twitter

Liste d'objets en C#

Problème de compréhension

Sujet résolu
    12 novembre 2017 à 22:50:07

    Bonsoir,
    J'essaye de faire un petit jeu avec mon fils, mais le langage objet est nouveau pour moi, ainsi que le C#.
    Je rencontre un problème dans la code suivant, je n'ai pas l'impression que la liste nommée pieces_laby se remplissent, en tout cas le prog me fait des erreurs à l’exécution lorsque j'essaye d'en lire des valeurs plus loin dans le programme.
    Pour info laby[x,y] est un tableau rempli de valeurs dans le code. Les valeurs construction_piece.xxx sont correctement remplies et lisibles (type int).
    Une âme charitable pourrait-elle nous assister svp ? Le code ci-dessous. Merci par avance.
            public List<Piece> pieces_laby;
            public Piece construction_piece;
            public Julupi()
            {
                InitializeComponent();
                decor = new Decor_de_base();
                porte_haut = new Portes();
                porte_gauche = new Portes();
                porte_droite = new Portes();
                joueur = new Joueur
                {
                    _orientation = 1, //1 = Nord, 2 = Est, 3 = Sud, 4 = Ouest
                    _Piece_joueur = 1
                };
                Construction_pieces();
            }
            /***************************************
              *        Création du labyrinthe 
           ***************************************/
            public void Construction_pieces()
            {
                int i = 0;
                Piece construction_piece = new Piece();
                List<Piece> pieces_laby = new List<Piece>();
                while (i <nb_piece_total)
                {
                    construction_piece._numpiece = laby[i,0];
                    construction_piece._pn = laby[i, 1];
                    construction_piece._pe = laby[i, 2];
                    construction_piece._ps = laby[i, 3];
                    construction_piece._po = laby[i, 4];
                    pieces_laby.Add(construction_piece);
                    i++;
                }
            }
    • Partager sur Facebook
    • Partager sur Twitter
      13 novembre 2017 à 1:21:23

      Salut,

      N'hésite pas à utiliser le bouton </> pour poster du code, c'est plus simple pour tout le monde ;)

      Sinon vu d'ici ton problème c'est que tu ne remplies pas la bonne liste. Ta liste "pieces_laby" à l'intérieur de ta méthode Construction_pieces() est déclarée dans ta méthode et c'est tout. En gros, sa durée de vie c'est ta méthode et voilà. Il faut remplir la liste pieces_laby qui existe déjà et que tu déclares ligne 1. Ton évite de déclarer cette liste dans ta méthode et utilise celle que tu as déjà dans ta classe et tout devrait rentrer dans l'ordre.

      • Partager sur Facebook
      • Partager sur Twitter
      Si un message vous a aidé, n'oubliez pas le +1 et de passer votre sujet en "Résolu" ! :)
        13 novembre 2017 à 23:01:37

        Bonsoir,

        Super, merci bien, cela fonctionne.

        Les éléments de la liste s'ajoutent bien; En revanche, chaque objet de la liste prend systématiquement la même valeur que le dernier en date. Par exemple :

        - _numpiece du premier objet de la liste vaut X lors de la première itération

        - Au second cycle, _numpiece vaut Y, et on l'ajoute en tant que second objet de la liste.

        Problème : _numpiece du premier objet prend aussi la valeur Y du coup, comme le second objet.

        Alors, on a trouvé qu'en inscrivant le '"new Piece" dans la boucle While, cela fonctionne correctement.

        Mais on aimerait bien comprendre pourquoi il faut recréer l'objet à chaque fois puisqu'il ne sert que de tampon à chaque boucle ? La petite logique des objets qui essaye de se mettre en place dans mon cerveau élevé au séquentiel :)

        NB : Merci pour le tips </>, je testerai çà prochainement, j'en aurai encore besoin, çà ne fait aucun doute.

        -
        Edité par BobMarley36 13 novembre 2017 à 23:06:41

        • Partager sur Facebook
        • Partager sur Twitter
          14 novembre 2017 à 0:47:51

          Yo,

          Ton erreur c'est de croire qu'à chaque tour de boucle, tu crées un nouveau construction_piece alors que non puisque tu as bien placé le new... en dehors de la boucle.

          Tu ne places pas un nouvel objet dans chaque case du tableau, en vérité tu places dans chaque case du tableau une référence vers l'objet construction_piece. Tu as un seul objet construction_piece référencé dans chaque case de ton tableau. Donc, un changement sur une case du tableau affecte l'objet qui y est référencé et par conséquent toutes les cases, vu qu'elles contiennent toutes une référence vers le même objet.

          Tu peux créer un constructeur valué pour ton objet Piece et réduire un peu ta boucle. C'est normal de créer un nouvel objet à chaque tour de boucle si ces Piece sont toutes différentes.

          for(int i = 0; i < nb_piece_total; i++)
          {
              pieces_laby.Add(new Piece(laby[i, 0], ..., laby[i, 4]));
          }

          Have fun

          -
          Edité par Pyrobolser 14 novembre 2017 à 0:48:16

          • Partager sur Facebook
          • Partager sur Twitter
          Si un message vous a aidé, n'oubliez pas le +1 et de passer votre sujet en "Résolu" ! :)
            14 novembre 2017 à 7:34:42

            Superbe explication qui clarifie les choses.

            Pour le code, je vais tester çà ce soir.

            Merci beaucoup

            Cordialement

            Pierre

            • Partager sur Facebook
            • Partager sur Twitter

            Liste d'objets en C#

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown