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

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?

0

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

0

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

2

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ć?

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

0

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

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