[C#] fout bij aanspreken van objecten in een array

Pagina: 1
Acties:
  • 2.554 views sinds 30-01-2008
  • Reageer

  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
ik ben bezig met het leren van c#. aangezien ik in c++ een mooie implementatie van een boom structuur had leek het me leuk die ook in c# te implementeren.

het idee is dat iedere node in de boom een arraylist heeft waar andere nodes in kunnen. dat lijkt goed te gaan. totdat ik een subnode wil aanspreken met een functie... dan krij ik elke keer de foutmelding : "de toepassing heeft een fout gegenereerd die niet kon worden verwerkt."

de afgelopen 2 dagen ben ik er al mee bezig, ik heb de volgende dingen geprobeerd:
- arraylist gewoon doorlopen
- arraylist doorlopen met een enumerator
- normale array ipv arraylist gebruiken
- normale array en die doorlopen met een enumerator

mijn laatste poging (waar ik hieronder de code van post) werkt dus met een fixed size array. dat is niet wat ik wil maar om uit te sluiten dat het met de arraylist te maken heeft heb ik dat maar gedaan.

code:
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
namespace Tree
{
    
    public class Root
    {
        dLogWriteLn LogWriteLn = new dLogWriteLn(oLog.WriteLn);
        private Node    root;
        private int     id;
        public  int     Id  {
            get {
                return id;
            }
        }

        public Root(int newid) {
            id = newid;
            root = new Node(newid);
        }
        
        public bool AddNode(int parent, int child) {
            if (parent == id) {
                root.AddNode(child);
                return true;
            }
            return false;
        }
        //
        public void Test() {
            this.AddNode(0, 1);
            this.AddNode(0, 2);
            int test1 =  root.FindNode(1);
            LogWriteLn (4, "returned id:" + test1);
        }
    }
    
    public class Node
    {
        dLogWriteLn LogWriteLn = new dLogWriteLn(oLog.WriteLn);

        private int id;
        public  int Id {
            get {
                return id;
            }
        }
        
        private Node[]      children = new Node[16];
        private int         childrenCount = 0;
        public  int         ChildrenCount {
            get {
                return childrenCount;
            }
        }
        
        public Node(int newid) {
            id = newid;
            LogWriteLn (4, "Created node: " + id);
        }
        
        public int FindNode(int find) {
            if (this.id == find) {
                return this.id;
            }
            if (childrenCount > 0)  {
                IEnumerator Test = children.GetEnumerator();
                while (Test.MoveNext()) {
                    Node t = (Node) Test.Current;
                    LogWriteLn (4, "" + t.ToString());
                }
            }
            return -1;
        }
        
        public bool AddNode(int child)  {
            childrenCount++;
            children[childrenCount] = new Node(child);
            return true;
        }
        
    }
}


op regel 68 gaat het dus mis. het algoritme zoals het er nu staat klopt geeen hol van btw, maar het probleem wat ik eerst uit de weg wil helpen is dat ik daar dus die t kan aanspreken zondaer dat de boel crasht. het maakt ook niet uit welke methode van t ik aanroep, hij crashed gewoon... wat doe ik fout?

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 28-02 19:26
Je probeert een Object naar een string te casten en uit te schrijven?
Waarom implementeer je geen override op de ToString?

Overigens is dit denk niet je way to go voor het bouwen van een Tree. Waarom heb je perce een Root nodig?
Je bovenste knoop is toch ook van het type Node?

[ Voor 40% gewijzigd door Alex op 29-07-2005 15:08 ]

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
aaah fuck mn override voor toString () is weggevallen... die zit dus wel in mn code thuis (post dit vanaf mn werk). die toString() was ook gewoon om te kijken waar het aan lag. dat maakt ook weinig uit, want welke methode ik ook aanroep (FindNode, AddNode) hij crashed gewoon.... ik had daar ook ook de volgende regel kunnen tikken en dan was het zaakje ook fout gegaan (heb het geprobeerd ;))
code:
1
int blaat = t.Id


verder omtrent je kritiek wat betreft design... dit is onderdeel van een iets groter gebeuren waarin 2 trees dezelfde ID-numerings pool (die ID's kunnen nl niet random gekozen worden maar moeten wel uniek zijn) delen. wou een lang verhaal tikken waarom het niet kan, maar misschien dat het toch wel mogelijk is besef ik me nu... maar dat tik ik ook al in de TS, ik weet dat het algoritme nog lang niet okay is, dat kan ik hopelijk zelf oplossen... maar waar ik dus niet uitkom is waarom ik die verdomde methoden niet kan aanspreken zonder de boel te laten crashen

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Zoals het er nu uitziet voeg je het eerste element op positie 1 toe. Het is ook niet nodig om de childrenCount bij te houden, want die kan je gewoon uit de ArrayList opvragen. Je hoeft dan alleen maar toe te voegen door children.Add(child) te doen.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
het is dus op het moment een array ipv een arraylist, dit om uit te sluiten dat het aan de arraylist zou liggen...

en bedoel je dat door children.Add(1) ik in feite een Node(1) toevoeg? ik dacht namelijk dat je dat deed met children.Add(new Node(1)) :?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:58
Ik snap die 'find' methode eigenlijk niet ?
Wat voor nut heeft die ? Zoals ik het nu zie, returned die gewoon het id van de node die moet 'gevonden' worden ? Maar, dat id geef je zelf al op, en als die node niet bestaat, return je -1 ? Waarom maak je daar gewoon geen Exists method van die een boolean returned ?

Je hebt ook wel een array gealloceerd die ruimte biedt voor 16 elementen, maar, als er nog niets in die array zit, zal element 0 tem 15 NULL bevatten; als je die dus aanspreekt, dan zal je een NullReferenceException krijgen.

Welke exceptie krijg je trouwens precies ?

https://fgheysels.github.io/


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
st0p schreef op vrijdag 29 juli 2005 @ 15:45:
het is dus op het moment een array ipv een arraylist, dit om uit te sluiten dat het aan de arraylist zou liggen...

en bedoel je dat door children.Add(1) ik in feite een Node(1) toevoeg? ik dacht namelijk dat je dat deed met children.Add(new Node(1)) :?
In de AddNode verhoog je eerst childrenCounter, en voegt 'm daarna op die positie toe. Initieel is de childrenCounter 0, maar bij het eerste element toevoegen wordt ie dus gelijk al 1. Voor het geval je het niet wist: De positie van elementen in een array begint bij 0.

Je kan dus ook zelfs die twee regels samenvoegen met:

C#:
1
children[childrenCount++] = new Node(child);


Als je dus 1 element in een array hebt, staat ie op positie 0 en is de size 1.

edit:

Ipv childrenCount kan je waarschijnlijk ook gewoon van children.Length gebruiken.

[ Voor 13% gewijzigd door riezebosch op 29-07-2005 16:10 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
@whoami: wat een scherpte ;) de reden dat ik nu alleen een int teruggeef is dat ik dus al 2 dagen tegen een crash aanloop en dat ik alles wat voor deze n00b ook maar enigzins "geavanceerd" is, heb versimpeld om te kijken of dat dan misschien de oplossing zou zijn. in eerste instantie gaf hij de node die gevonden was zelf terug zodat je addnode op die node kon gebruiken.
hij zegt dus in de de messagebox die verschijnt: " de toepassing heeft een fout gegenereerd die niet kon worden verwerkt."
ik weet nog niet hoe ik de gegooide exceptie kan opvangen en weg kan schrijven of weergeven oid, ik ga even kijken of ik dat snel kan uitvogelen.

@riezebosch: dom van me... het is me ook helemaal niet opgevallen oid. ik heb het even snel aangepast, maar ik krijg nog steeds een crash...

blegh, ik had gehoopt dat ik gewoon iets over het hoofd had gezien... misschien maar gewoon alles wegflikkeren en opnieuw beginnen. vandaag iig geleerd dat het niet handig is om code die je zwaar verkreupeld hebt om zo de fout te lokaliseren te posten op tweakers want zie zien het meteen en maken gehakt van je ;)

[edit]
de exception is:
de objectverwijzing is niet op een exemplaar van een object ingesteld.

[ Voor 6% gewijzigd door st0p op 29-07-2005 16:22 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:58
Een exceptie van je zo op:

code:
1
2
3
4
5
6
7
8
try
{
  // code die exceptie veroorzaakt.
}
catch( Exception ex )
{
  // doe er iets mee
}

Echter, als je die try/catch niet gebruikt, dan wordt die exceptie gewoon omhoog gegooid in de stack, tot wanneer die ergens opgevangen wordt.
Wordt die nergens opgevangen, dan zou je toch normaal gezien de boodschap moeten zien, en da's dan iets uitgebreider dan hetgeen jij krijgt.

Ik denk dat het te maken heeft, met het feit dat je een element die zich in die array bevindt, aanspreekt, 'm naar een 'Node' cast, en het Id wilt ophalen, terwijl dat element NULL is.
Zet eens een breakpoint op de eerste regel van die Find method, en voer die eens stap voor stap uit; bekijk waar het mis gaat, en kijk ook eens wat de inhoud van die array is op de gegeven positie.
de objectverwijzing is niet op een exemplaar van een object ingesteld.
Een NullRef exceptie dus. :)

Vervang die array eens door een ArrayList, dat zal toch iets makkelijker gaan.

[ Voor 12% gewijzigd door whoami op 29-07-2005 16:25 ]

https://fgheysels.github.io/


  • XKB
  • Registratie: Oktober 1999
  • Laatst online: 05-04-2021

XKB

Anonymous functional

Ik verwacht dat je een NullReference exception krijgt doordat, zoals whoami ook al schrijft, de array nu een aantal null elementen bevat, waar je vervolgens wel id van wil inspecteren.


edit:
bah sneller leren typen

[ Voor 11% gewijzigd door XKB op 29-07-2005 16:30 ]

Choose for Choice! Choose Linux! | src van icon


  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
normaal gezien zou ik idd ook verwachten dat die boodschap wat uitgebreider wasmaar dat is ie dus niet, op een procesid en een threadid na.

ik zal het nog eens met die arraylist proberen, maar aangezien ik daar dus mee begonnen ben en het toen al fout liep heb ik weinig hoop 8)7

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Dat ligt dan echt aan jou zelf, want ik heb ook een Tree op basis van een ArrayList gebouwd B)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

riezebosch schreef op zaterdag 30 juli 2005 @ 10:49:
Dat ligt dan echt aan jou zelf, want ik heb ook een Tree op basis van een ArrayList gebouwd B)
Houd er wel rekening mee dat hij een beginner is, het is dus op zich niet zo erg dat hij wat meer regels code maakt dan jij. Wat gevorderde programmeurs willen graag compact schrijven, beginnende programmeurs moeten eerst de structuur van de taal verkennen.

Edit: doelde op een paar post hierboven, waar het over dingen op een regel zetten ging... :*) en in het leven is niet alles nuttig...

[ Voor 15% gewijzigd door Verwijderd op 05-08-2005 09:42 . Reden: Modje ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:58
Nuttig om daarvoor een topic te kicken...

Of je nu gebruik wilt maken van een arraylist of een array, dat maakt niets uit voor het 'leren programmeren'.

https://fgheysels.github.io/

Pagina: 1