[C#] Vreemde "bugs" bij het gebruiken van een list

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bitbored
  • Registratie: Oktober 2008
  • Laatst online: 08-07 15:05
Zoals altijd post ik problemen waar ik na een lange tijd nog geen oplossing voor heb gevonden, nog snel even op GoT.
Nu heb ik niet 1, maar 2 problemen, bijde gerelateerd met de List class.

Probleem 1:
Doel van de oefening: Simuleren drankbak
Als ik een boolean aanpas, die zich in de class flesje bevindt, wordt een List of een Arraylist, die zich in de klasse drankbak bevindt, plotseling null.
Ik heb dit op verschillende computers getest, ik heb al eindeloos veel gedebugt en opnieuw gebuild, maar hetzelfde blijft steeds gebeuren.
Indien ik de lijn code verwijder waar de boolean op false wordt gezet, dan gebeurt er niets verkeerd.

De code (met een Arraylist, maar hetzelfde gebeurt met een list):
C#:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Labo6_Drankbak
{
    class Flesje
    {
        private String sDrankType;
        private Boolean xLeeg=false;
        #region propereties
        public String DrankType
        {
            get
            {
                return this.sDrankType;
            }
            set
            {
                sDrankType = value.ToString();
            }
        }
        public Boolean Leeg
        {
            get
            {
                return xLeeg;
            }
        }
        #endregion //properties

        #region publicFunctions
        public Flesje(string DrankType)
        {
            sDrankType = DrankType;
        }
        public void DrinkLeeg2()
        {
            xLeeg = true; //<-- Hier loopt het mis
        }
        public void SteekTerug(Bak bak)
        {
            bak.SteekTerug(this);
        }
        #endregion //publicFunctions
    }

    class Bak
    {
        private string sDranktype;
        private ArrayList lstFlesjes = new ArrayList();

        #region properties
        public string DrankType
        {
            get
            {
                return sDranktype;
            }
        }
        public int TotaalAantal
        {
            get
            {
                return lstFlesjes.Count;
            }
        }
        public int VolAantal
        {
            get
            {
                int iAantal = 0;
                foreach (Flesje flesje in lstFlesjes)
                {
                    if (!flesje.Leeg)
                        iAantal++;
                }
                return iAantal; //Tel aantal lege flesjes in lstFlesjes
            }
        }
        #endregion //properties

        public Bak(String drankType, int grootte)
        {
            sDranktype = drankType;
            Flesje tmpFlesje = new Flesje(drankType);
            for (int i = 0; i < grootte; i++)
            {
                lstFlesjes.Add(tmpFlesje);
            }
        }
        public Flesje Neemflesje()
        {
            try
            {
                Flesje GenomenFlesje =null;
                foreach (Flesje flesje in lstFlesjes)
                {
                    if (!flesje.Leeg)
                    {
                        GenomenFlesje = flesje;
                    }
                }
                lstFlesjes.Remove(GenomenFlesje);
                return GenomenFlesje;
            }
            catch
            {
                throw new Exception("De bak is leeg");
            }
        }
        public void SteekTerug(Flesje flesje)
        {
            lstFlesjes.Add(flesje);
        }
    }
}


Ik heb verschillende mensen met ervaring in .net al eens aangeproken over dit probleem, maar niemand blijkt te weten hoe het komt.
Is er iemand op GoT die de oorzaak en/of een oplossing kent?

Acties:
  • 0 Henk 'm!

  • GateKeaper
  • Registratie: April 2004
  • Laatst online: 05-08 21:46

GateKeaper

#1 Procastinator

Misschien ook handig om even te vertellen hoe je de objecten aanroept.

Iets als:
[code]
var Bak = new Bak();
Bak.VulMetFlesjes();
var Flesje = Bak.NeemFlesje();
[/code]

You get it. Dan is het ook handiger voor ons om te kijken waar het mis kan gaan. Nu is het gissen naar hoe je de objecten gebruikt.


Never mind. Soultaker heeft helemaal gelijk, volledig overheen gelezen.

[ Voor 14% gewijzigd door GateKeaper op 16-11-2011 13:28 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:11
Het probleem is dat je in de constructor van Bak maar één Flesje construeert, en dan meerdere references naar dat ene Flesje in je lijst stopt. Wanneer één flesje leeg is zijn ze dus allemaal leeg, want er is überhaupt maar één flesje. Probeer de instantiatie van Flesje binnen de lus te trekken.

Acties:
  • 0 Henk 'm!

  • Bitbored
  • Registratie: Oktober 2008
  • Laatst online: 08-07 15:05
Soultaker schreef op woensdag 16 november 2011 @ 13:21:
Het probleem is dat je in de constructor van Bak maar één Flesje construeert, en dan meerdere references naar dat ene Flesje in je lijst stopt. Wanneer één flesje leeg is zijn ze dus allemaal leeg, want er is überhaupt maar één flesje. Probeer de instantiatie van Flesje binnen de lus te trekken.
Je hebt gelijk, een klein foutje waar ik al die tijd heb over gekeken :|
Mijn volgende probleem zal ik dus maar eerst nog eens goed bekijken voor ik het hier zet.

Bedankt!