[C++] Wskaźnik do tablicy dwuwymiarowej


(Navarrano) #1

Witam,

prosiłbym bardzo o wsparcie bo utknąłem w miejscu z moim programem.

Chcę stworzyć uproszczoną mapę do gry w Allegro w ten sposób, że moje okno o wymiarach 800 x 640 dzielę na kwadraty 40x40.

Każdy z takich kwadratów przedstawiony jest w formie klasy MapObject tak więc moja klasa map_generator zawiera wskaźnik:

MapObject** map

. Oczywiście alokuję dla niego pamięć tak aby mieć [16][20] takowych obiektów MapObject Problem polega na tym, że metoda klasy map_generator wczytuje plik tekstowy opisujący mapę do utworzenia i jeśli spełnia się pewien warunek to danemu kwadratowi [x][y] powinien być przypisany obiekt klasy Wall ( klasa jest klasą pochodną od MapObject( klasa wirtualna) ).

void map_generator::GetMapFromFile( void )

{

	int type;

	int i = 0;

	int j = 0;

	while( !map_file.eof() )

	{

		map_file >> type;

		if( type == 1 )

		{

			Wall wall(i,j);

			*(*(map+i)+j) = &wall;

		}

		i++;

		if( !(i % 20))

		{

			i = 0;

			j++;

		}

	}

}

Niestety ten zapis który użyłem w tym kodzie nie działa i szczerze nie wiem jak to zrobić żeby zadziałało.

Z gory dziękuję za pomoc :slight_smile:


(etam) #2

1) Zmień nazwy zmiennych z "i" i "j" na "y" i "x" - będzie czytelniej

2) Nie prościej byłoby to zrobić na dwóch pętlach for?

3) map[j] nie działa?


(Blapiter) #3

Czy klasa MapObject ma konstruktor kupujący i przeciążony operator przypisania? To jedziemy

Błąd :

if( type == 1 )

      {

         Wall wall(i,j);

         *(*(map+i)+j) = &wall;// BŁĄD do zaalokowanej pamięci przypisujesz adres obiektu a nie obiekt więc jak już to bez "&";

      }

Przypisanie w taki sposób miało by sens w takim przypadku:

MapObject * wsk=0;

 Wall wall(i,j);

 wsk = &wall;

Najlepiej tak :

if( type == 1 )

      {

         map[i][j] = Wall(i,j);

      }

Reszta kodu jest jakaś dziwna masz zmienną 'i' gdzie wcześniej piszesz że masz tablica 16X20 a robisz :

i++;

      if( !(i % 20))

      {

         i = 0;

         j++;

      }

Czyli 'i' będzie miało wartość 19 a nie maks 15