Polimorfizm klas - błąd odczytu

0

Witam

Tworzę małą grę. Napisałem sobie, kawałek kodu: zawiera on na razie dwie klasy - jedna czysto wirtualna, a druga pochodna od niej. Następnie utworzyłem main() lokalną tablicę wskaźników (statyczną) do klasy bazowej i umieściłem w niej parę elementów klasy pochodnej.

Część kodu: (jeśli to jest za mało, żeby coś powiedzieć do dodam więcej, ale nie chcę też wklejać wszystkiego, bo to bez sensu...)

int main(void)
{
	warrior* Army[2 * MAX_WARRIORS]; //MAX_WARRIORS = 50, warrior - czysto wirtualna klasa bazowa
	Army[0] = new warInfantry(4, 6, 1, 0); //werInfanrty - klasa pochodna od klasy warrior
	Army[1] = new warInfantry(7, 8, 2, 1);
	Army[2] = new warInfantry(3, 5, 1, 2);
	cout << *Army[0] << " " << *Army[1] << " " << *Army[2]; //tu wypisanie działa
	/* ... parę deklaracji ...*/
	Fulfilment[0] = Fulfilment[2] = 1; //znaczniki, gdzie są jakieś elementy w statycznej tablicy i jakiego gracza.
	Fulfilment[1] = 2;
	printBoard(Board, *Army, Fulfilment); // wypisanie - Tu się psuje
 

I funkcja:

void printBoard(const int Board[45][27], warrior* Army, const int Fulfilment[2 * MAX_WARRIORS])
{
	int redInx = 0, blueInx = 0;
	/* ...różne wypisania itd ... */
		redInx = searchSoldiers(Fulfilment, 1, redInx); // funkcja sprawdza, gdzie w tablicy Fulfilment jest zaznaczona kolejna jednostka gracz 1(red)/2(blue)
										//i podaje numer (-1 gdy nie ma kolejnych
		if (redInx != -1)
			cout << Army[redInx];// to wypisanie działa
		else
			cout << "brak"; 
		blueInx = searchSoldiers(Fulfilment, 2, blueInx);
		if (blueInx != -1)
			cout << Army[blueInx]; //a to już nie
		else
			cout << "brak";
		redInx++;
		blueInx++;
	}
} 

Kod błędu:
Unhandled exception at 0x012D418C in BoardWars v2.exe: 0xC0000005: Access violation reading location 0x00000006.

Próbuję rozwiązać to od soboty, ale nie mam nawet pojęcia co nie działa. Nigdzie nie modyfikuję tablicy Army[], więc nie wiem czemu w main() działa, a potem nie.
Będę wdzięczny również za małe podpowiedzi.

Pozdrawiam
Piotr

2

Unhandled exception at 0x012D418C in BoardWars v2.exe: 0xC0000005: Access violation reading location 0x00000006.

mowi bardzo jasno. Starasz sie uzywac zmiennej ktora jest NULLem.
Debugger do reki. krok po kroku i znajdziesz linijke ktora to powoduje. Pozniej dajesz Watcha na wszystko co znajduje sie w tej linijce i bedziesz wiedziec ktora zmienna jest nullem.

edit. I cos jest nie tak. Bo masz wskaznik w deklaracji funkcji a przekazujesz wartosc wskaznika. Najlepiej bedzie poleciec debuggerem :) Zajmie Ci to 5 min

2
 printBoard(Board, *Army, Fulfilment);

*Army to Army[0]. printBoard dostaje wskaźnik na pojedynczy element i go traktuje jak tablicę, nic dziwnego, że wywala się po wyświetleniu pierwszego elementu.

Gdyby Ci się chciało skorzystać z debuggera to byś nie marnował czasu "od soboty" i w kilka minut odnalazł ten błąd.

Przy okazji: jeśli to niedawno pisany kod to nadaje się on wyłącznie do napisania od nowa, tym razem zgodnie z dobrymi praktykami. Siejesz wszędzie new i delete, przekazujesz "tablicę" do funkcji - tyle widać z tak ograniczonego kawałka kodu.

2
printBoard(Board, Army, Fulfilment); // wypisanie - Tu się psuje
...
void printBoard(const int Board[45][27], warrior *Army[], const int Fulfilment[2 * MAX_WARRIORS])
...
cout << *Army[redInx];// to wypisanie działa
...
cout << *Army[blueInx]; //a to już nie
0

Próbowałem używać debbugera, ale nie wpadłem na pomysł, że jest źle przekazywany argument. Nie znałem też "watch". Dziękuję za pomoc ;)

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