[C++/CLI] Array van objecten ongedefinierd

Pagina: 1
Acties:

  • giveupthejoost
  • Registratie: Maart 2006
  • Laatst online: 21-03-2016
Beste,

Ik probeer van een klasse die ik gemaakt heb meerdere instanties tegelijkertijd te maken. Als oplossing vermoedde ik een array aan te maken van die klasse. Het programma compileert, buildt en runt, maar wanneer de klasse in de array toegevoegd moet gaan worden crasht de applicatie in de volgende situatie:

Een versimpelde versie, in een los cpp-bestand:
C++:
1
2
3
4
5
6
7
ref class cCollection
{
public:
  int id;
  array<Point>^ points;
  char* name;
};


Definieer de array als volgt in de klasse van de applicatie:
C++:
1
2
3
4
public:
array<cCollection^>^ aCollection;

array<cCollection^>^ aCollection = gcnew array<cCollection^>(99);

en in mijn event btnAdd_Click:
C++:
1
2
3
4
5
iCount++;

cCollection^ tempCollection = gcnew cCollection;

aCollection[iCount] = tempCollection;

.. daarop crasht mijn applicatie en zie ik in de debugger: "aCollection contains < undefined value > " Wat gaat er fout?

Wellicht is dit niet de meest nette oplossing, ik houd me graag aanbevolen voor betere alternatieven, vriendelijk bedankt,

joost

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

(jarig!)
Je geeft een beetje te weinig info om na te gaan wat er nou precies fout gaat. Wat is iCount bijvoorbeeld, waar initialiseer je die. "Het crasht" hebben we ook niet echt iets aan, wat zijn de meldingen die je krijgt? Probeer je probleem te localiseren en maak een klein testapplicatietje waarbij de fout ook optreedt.

[ Voor 19% gewijzigd door .oisyn op 01-03-2006 14:28 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • giveupthejoost
  • Registratie: Maart 2006
  • Laatst online: 21-03-2016
Om precies te zijn krijg ik bij het uitvoeren van het volgende stukje code:

C++:
1
aCollection[iCount] = tempCollection; //tempCollection is van het type cCollection


stopt de applicatie en geeft de debugger de volgende melding:

"An unhandled exception of type 'System.NullReferenceException' occurred in test001.exe

Additional information: Object reference not set to an instance of an object."


Om te testen had ik een button gemaakt en elke keer wanneer ik op die button druk voert ie het laatste stukje code uit.

In theorie is de code die ik getypt heb goed, want mijn applicatie compileert foutloos. Met het 2e stukje code vermoed ik dat ik een array aanmaak van het type cCollection. Ik krijg in mijn Inspector te zien dat aCollection een < undefined value > als waarde geeft. Dus waarschijnlijk zit er iets in de definitie fout van de array.

Waar ik naartoe wil is dat bij een druk op de knop een instantie van mijn klasse aan een array wordt toegevoegd.

Maar ik ben geen programmeur, wel wat ervaring met Borland C++ Builder en ANSI C, maar niet in deze hoek; dus ik probeer dit allemaal een beetje uit. Iemand die mij een duwtje in de goede richting geeft?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

(jarig!)
Uit je error maak ik op dat aCollection nog niet geinitialiseerd op het moment dat je een collection probeert toe te voegen.

En dat je code compileert wil nog niet zeggen dat het ook goed is ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • giveupthejoost
  • Registratie: Maart 2006
  • Laatst online: 21-03-2016
Precies, dat is het probleem. Het werkt overigens wel wanneer ik die defiitie van de array in de btnAdd_click eventhandler stop. Maar dan maakt ie elke keer wanneer ik op die knop druk een hele nieuwe array aan.

Hij zou 1 array moeten maken, en wanneer je op de knop drukt daar een instantie aan toe moeten voegen.

Echter weet ik niet precies waar ik die array moet definieren.

Als je de applicatie bekijk zit ie als volgt in elkaar:

frmTest001.h

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace Test001
{

public ref class frmTest001 : public System::Windows::Forms::Form
    {
    private:
        array<cCollection^>^ aCollection;
        int iCount;
    public:
        frmMain(void)
        {
            array<cCollection^>^ aCollection = gcnew array<cCollection^>(99);
            InitializeComponent();
        }
    //Dan volgt de deconstructor 
    //en een handel gegenereerde code voor formulier elementen
    }
    private: System::Void btnAdd_Click(System::Object^  sender, System::EventArgs^  e);

}


Als je Borland gewent bent zit dit ineens heel anders in elkaar.. met name ben ik nog onder de indruk van die dakjes :)

[ Voor 4% gewijzigd door giveupthejoost op 01-03-2006 15:37 ]


Verwijderd

euhm wat zijn die dakjes precies dan? :/

en is:

array<cCollection^>^ aCollection = gcnew array<cCollection^>(99);

niet lokaal in formload? dwz de globale array is niet geinit.

[ Voor 65% gewijzigd door Verwijderd op 01-03-2006 17:27 ]


  • giveupthejoost
  • Registratie: Maart 2006
  • Laatst online: 21-03-2016
hmm.. ok, waar zou ik die dan het best kunnen plaatsen..?

Verwijderd

declaratie gewoon zo laten en:

aCollection = gcnew array<cCollection^>(99);

ipv

array<cCollection^>^ aCollection = gcnew array<cCollection^>(99);

in de formload en het zou moeten werken..

de versie die je nu hebt, declareer je boven een array en in de formload declareer en initialiseer je een andere array. alleen de code onder de button kijkt naar de declaratie boven, omdat hij de array in de formload niet bij hem bekend is, scope etc.

ben nog steeds een beetje confuus over die ^

[ Voor 37% gewijzigd door Verwijderd op 01-03-2006 18:47 ]


  • giveupthejoost
  • Registratie: Maart 2006
  • Laatst online: 21-03-2016
Aha! perfect, het werkt! Achteraf ook wel loogies, wel vreemd dat dan niet verteld wordt bij het compileren of linken dat er een dubbele declaratie is.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 08-04 12:26
Verwijderd schreef op woensdag 01 maart 2006 @ 18:41:
ben nog steeds een beetje confuus over die ^
Heeft iets met managed/unmanaged te maken in VC++ .Net. Anywayz, het zijn pointers

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

(jarig!)
giveupthejoost schreef op donderdag 02 maart 2006 @ 08:28:
Aha! perfect, het werkt! Achteraf ook wel loogies, wel vreemd dat dan niet verteld wordt bij het compileren of linken dat er een dubbele declaratie is.
Het is helemaal geen dubbele declaratie, je kunt prima dezelfde variabelen hebben in verschillende scopes. Net als dat je parameters ook dezelfde namen kunt geven als je members, zodat je this moet gebruiken om die parameters aan die members te assignen.

En die dakjes zijn idd managed pointers (pointers naar .Net objecten), het is dus de managed tegenhanger van *, net als de % de managed tegenhanger van & is.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1