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

Odpowiedz Nowy wątek
2014-12-23 22:19
0

Witam!
Stworzyłem klasę która zawiera kilka zmiennych i konstuktor:

 
    public:
        String^ nazwaWaluty;
        String^ skroconaNazwaWaluty;
        double kursKupna;
        double kursSprzedazy;
        double kursSredni;
        Kurs(String^ nazwaWaluty,String^ skroconaNazwaWaluty,double kursKupna,double kursSprzedaz, double kursSredni) {
            this->nazwaWaluty = nazwaWaluty;
            this->skroconaNazwaWaluty = skroconaNazwaWaluty;
            this->kursKupna = kursKupna;
            this->kursSprzedazy = kursSprzedazy;
            this->kursSredni = kursSredni;
        }
    };

Następnie zadeklarowałem sobie globalnie tablicę:

    public:
        array <Kurs^>^ kursyWalut;
 

W jednej z procedur do programu chciałem zrobić stworzyłem tą tablicę i chciałem przypisać do każdego z obiektów zmienne:

 
    public: System::Void rozdzielDane() {
 
                         [...]
 
            kursyWalut = gcnew array<Kurs^>(zliczSredniki()/4);     
            for (int j=0;j<kursyWalut->Length;j++) {
                for (int i=wskaznikStop2;i<kursyWalut->Length;i+=4){                    
                    kursyWalut[j]->nazwaWaluty = rozdzieloneDane[i];
                    kursyWalut[j]->skroconaNazwaWaluty = rozdzieloneDane[i+1];
                    kursyWalut[j]->kursKupna = System::Convert::ToDouble(rozdzieloneDane[i+2]);
                    kursyWalut[j]->kursSprzedazy = System::Convert::ToDouble(rozdzieloneDane[i+3]); 
                    kursyWalut[j]->kursSredni = (System::Convert::ToDouble(rozdzieloneDane[i+2])+System::Convert::ToDouble(rozdzieloneDane[i+3]))/2;
                    wskaznikStop2=i;                    
                    break;                  
                }
            }
 
            }

Program normalnie się kompiluję tylko gdy wcisnę button w którym wywoluje się ta procedura wywala taki komunikat:
An unhandled exception of type 'System.NullReferenceException' occurred in Kalkulator walut.exe
Additional information: Object reference not set to an instance of an object.

Gdzie jest błąd?

Pozostało 580 znaków

2014-12-23 22:57
0

kursyWalut to tablica WSKAŹNIKÓW a nie obiektów. Nie tworzysz żadnego OBIEKTU Kurs a próbujesz tam wpisać jakieś dane.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2014-12-23 22:58

Pozostało 580 znaków

2014-12-24 11:36
0

Ok, to jak teraz stworzyć tablicę obiektów? Pierwszy raz mam styczność z Visualem i nie bardzo sobie radze :(

Pozostało 580 znaków

2014-12-24 13:46
msm

Musisz stworzyć każdy obiekt zanim do niego coś zapiszesz.

kursyWalut[j]->nazwaWaluty = rozdzieloneDane[i];
kursyWalut[j]->skroconaNazwaWaluty = rozdzieloneDane[i+1];
kursyWalut[j]->kursKupna = System::Convert::ToDouble(rozdzieloneDane[i+2]);
kursyWalut[j]->kursSprzedazy = System::Convert::ToDouble(rozdzieloneDane[i+3]);    
kursyWalut[j]->kursSredni = (System::Convert::ToDouble(rozdzieloneDane[i+2])+System::Convert::ToDouble(rozdzieloneDane[i+3]))/2;

Prawdopodobnie (skoro i tak masz konstruktor zdefiniowany) zamiast tego wszystkiego chcesz zrobić coś w rodzaju:

kursyWalut[j] = gcnew Kurs(rozdzieloneDane[i],
    rozdzieloneDane[i+1],
    System::Convert::ToDouble(rozdzieloneDane[i+2]),
    /*reszta parametrów*/);

A z innych spraw, ten break na końcu fora:

for (int j=0;j<kursyWalut->Length;j++) {
    for (int i=wskaznikStop2;i<kursyWalut->Length;i+=4){                    
        // ...
        wskaznikStop2=i;                    
        break;                    
    }
}

Nawet jeśli działa to dziwnie wygląda (bo druga pętla for wcale nie jest pętlą, bo wykonuje się zawsze tylko raz) - na pewno tak powinno być?

edytowany 3x, ostatnio: msm, 2014-12-24 13:48

Pozostało 580 znaków

2014-12-24 14:19
0

Właśnie coś takiego chciałem zrobić, tylko nie za bardzo wiedziałem jak stworzyć obiekt tej klasy :D a co do tej pętli to na razie jest to w fazie testu i zapewne będę musiał to zmienić :P

Pozostało 580 znaków

2014-12-24 18:15
0

Lepiej rozszerzać tablicę dynamicznie niż dwa razy czytać plik.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0