Dynamiczna dwuwymiarowa tablica wskaźników na obiekty klasy

0

Witam

Potrzebuje utworzyć dwuwymiarową dynamiczną tablice wskaźników na obiekty klasy Person, której wymiary podaje się jako argumenty wiersza poleceń.

Przy utworzeniu jej wprost, tzn.:

int main(int argc, char *argv[]) {
	int x = atoi(argv[1]);
	int y = atoi(argv[2]);
Person **population = new Person *[x][y]; 

pojawia się błąd o niestałej wartości y.
Spróbowałem więc coś takiego

 Person **population = new Person *[x]; 
	for (int i = 0; i < y; ++i) population[i] = new Person[y];

ale to jest chyba w tym momencie tablica obiektów a nie wskaźników na nie.

Pytanie moje jest jak zadeklarować taką tablicę? lub też jeśli deklaracja tablicy obiektów powyzej jest poprawna to czy można się po niej poruszać tradycyjną arytmetyką wskaźników (mam na myśli czy inkrementowanie wskaźnika pozwoli mi na przejście przez całą tablice zbudowaną w ten sposów)?

2

No to tablica wskaźników będzie miała jedną gwazdkę więcej :p

Person ***population = new Person **[y]; 
    for (int i = 0; i < y; ++i) population[i] = new Person*[x];
0

Jeśli potrzebujesz dwuwymiarową dynamiczną tablicę wskaźników, to potrzebujesz
Person ***population, a dalej jak w przypadku drugim. Ale lepiej uzyć np kontenerów standardowych.

0

ok, w takim razie jak się poruszać po takiej tablicy bo dając coś takiego

 	Person* wsk;
	Person* wsk1;
	wsk = population;
	for (int i = 0; i < x*y; i++) {
		
		wsk1 = new Person(true); //wypełnia tablice wskaźnikami na tworzone obiekty
		wsk = wsk1;
		wsk++;
	}
	wsk = population;
	for (int i = 0; i < x*y; i++)
	{
		wsk->showifsick(); //wywołanie metody klasy konkretnego obiektu
		++wsk;
	}

przy kompilacji wyskakują błędy o nie możności konwersji typu z Person *** na Person * i się gubie z tymi gwiazdkami gdzie i ile ich powinno być

edit: właśnie nie moge użyć STL'i bo to na projekt na studia muszę wszystko samodzielnie obsługiwać

2

Czemu nie odwołujesz się od razu do tablicy?

for (size_t i = 0; i < y; ++i) 
    for (size_t j = 0; j < x; ++j) 
        population[i][j] = new Person( true );

analogicznie dla pętli z showifsick()

1
 
for (int i = 0; i < x*y; i++) {
 
        wsk1 = new Person(true); //wypełnia tablice wskaźnikami na tworzone obiekty
        wsk = wsk1;
        wsk++;
    }

tu musisz dać 2 pętle, bo zaalokowałeś 2 wymiarową tablicę wskaźników,

0

wersja stryku działa to się jeszcze spytam o usuwanie tablicy

for (int i(0); i < y; ++i) delete[] population[i];//usuwanie
	delete[] population; 

przy takim czymś wywala mi program z błędem mówiącym że program próbował zapisać coś do pamięci poza końcem "heap buffer". nie wiem nawet co to znaczy

1
for(size_t i=0;i<y;++i)
  {
   for (size_t j=0;j<x;++j) delete population[i][j];
   delete[] population[i];
  }
delete[] population;
0
_13th_Dragon napisał(a):
for(size_t i=0;i<y;++i)
  {
   for (size_t j=0;j<x;++j) delete population[i][j];
   delete[] population[i];
  }
delete[] population;

dokładnie ten sam błąd "heap corruption detected"

0

Więc podaj cały kod.

0
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <ctime>

#include "Person.h"
using namespace std;

void showargs(int argc, char *argv[]) {
	cout << "Liczba argumentow w wierszu polecen: " << argc << endl;
	for (int i = 0; i<argc; ++i)
		cout << "Element numer " << i << " wiersza polecen ma wartosc: "
		<< argv[i] << endl;
}


int main(int argc, char *argv[]) {

	showargs(argc, argv);

	
	int x = atoi(argv[1]);
	int y = atoi(argv[2]);

	Person ***population = new Person **[x]; //tworzenie
	for (int i = 0; i < y; ++i) population[i] = new Person*[y];

	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++)
		{
			population[i][j] = new Person(true);
		}
	}

	for (int i = 0; i < y; i++)
	{
		for (int j = 0; j < x; j++)
		{
			population[i][j]->showifsick();
		}
	}


	for (size_t i = 0; i<y; ++i)
	{
		for (size_t j = 0; j<x; ++j) delete population[i][j];
		delete[] population[i];
	}
	delete[] population;
	
	cout << x<<y;
	getchar();
} 
0
  1. Nie nadużywaj postinkrementacji: http://4programmers.net/Forum/1101404
  2. zakomentuj: population[i][j]->showifsick(); i odpal jeszcze raz.
0

bez zmian, ten bład pojawia się już w dalszej części kodu

1

No tak, padłeś ofiarą bezsensownego nazewnictwa zaproponowanego przez ciebie, bezmyślnie poprawionego przez @stryku.
Z takim bezsensownym nazewnictwem nawet niepoczątkujące się gubią.

http://ideone.com/9LW8Px

#include <iostream>
using namespace std;

struct Person
  {
   Person(bool) {}
  };

int main(int argc,char *argv[])
  {
   size_t X=atoi("7");
   size_t Y=atoi("5");
 
   Person ***population=new Person **[Y];
   for(size_t y=0;y<Y;++y) population[y]=new Person*[X];
   for(size_t y=0;y<Y;++y) for(size_t x=0;x<X;++x) population[y][x]=new Person(true);

 
   for(size_t y=0;y<Y;++y) for(size_t x=0;x<X;++x) delete population[y][x];
   for(size_t y=0;y<Y;++y) delete[] population[y];
   delete[] population; 
   return 0;
  }

pętle można połączyć, ale nie zmieniać kolejności.

0

Działa, jednak chciałem się jeszcze o to nazewnictwo zapytać. Co było z nim nie tak?
Z tego co widze chodziło o x i y jednak nadal nie bardzo widzę przyczyny błędów, zamienione względem pętli były?

1
Orzel94 napisał(a):

Działa, jednak chciałem się jeszcze o to nazewnictwo zapytać. Co było z nim nie tak?
To jest fragment twego pierwszego postu:

Orzel94 napisał(a):
 Person **population = new Person *[x]; 
	for (int i = 0; i < y; ++i) population[i] = new Person[y];

dopóki nie zamienisz nazwy na sensowne nie zauważysz że pomyliły ci się wymiary. Nawet @stryku dał się nabrać: http://4programmers.net/Forum/1210854 a on nie jest byle początkującym.

0

Dobra kumam :)
to by było w takim razie tyle w temacie
Dzięki ;)

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