[C++] Spore tablice wielowymiarowe
Ostatnio zmodyfikowano 2012-06-23 21:22
Schulze13 Temat założony przez niniejszego użytkownika |
» 2012-06-20 16:05:56 Poczytałem. Zmieniłem mechanizm tworzenia mapy ptrB = NULL;
for( int i = 0; i < size; i++ ) { for( int j = 0; j < size; j++ ) { mapa[ i ][ j ] = new cBlok( i, j ); } } ptrB = new cBlok( 0, 0 ); std::cout << "\ngotowe mapa ma " << sizeof( * mapa ) << " bajtow\npole ma " << sizeof( * ptrB ) << " bajtow"; delete ptrB; ptrB = NULL;
(...kod...) cBlok * ptrB; cBlok * mapa[ size ][ size ];
Na oszczędniejszy w zasobach (Wskaźnik aż 4 bajty ma ,,/\(O.o)/\,,) ptrB = NULL;
for( int i = 0; i < size; i++ ) { for( int j = 0; j < size; j++ ) { ptrB = new cBlok(); mapa[ i ][ j ] = * ptrB; delete ptrB; } } ptrB = new cBlok(); std::cout << "\ngotowe mapa ma " << sizeof( * mapa ) << " bajtow\npole ma " << sizeof( * ptrB ) << " bajtow"; delete ptrB; ptrB = NULL; (...kod...) cBlok * ptrB; cBlok mapa[ size ][ size ];
Co do wielkości. Odpaliłem OpenTTD, spojrzałem na mapę 256 na 256... spore, więc 512 i 1024 sobie odpuszczę (zbyt wolna symulacja) |
|
Schulze13 Temat założony przez niniejszego użytkownika |
» 2012-06-20 16:54:39 Jeszcze jedno, żeby nowego tematu nie zakładać. Co i jak zrobić z sf::View , żeby mapę scrolować, bo nie wiem jak się tym obsłużyć :P. http://www.sfml-dev.org mało mi mówi. Lub po prostu jak scrolować mapę izometryczną bez zbędnej fatygi. |
|
Admixior |
» 2012-06-20 17:43:34 Wiem że się wtrącam w temat ale zostałem porażony: Na oszczędniejszy w zasobach (Wskaźnik aż 4 bajty ma ,,/\(O.o)/\,,) |
ptrB = new cBlok(); mapa[ i ][ j ] = * ptrB; delete ptrB;
cBlok mapa[ size ][ size ];
|
Więc mam pytanie: w jaki sposób to ma być oszczędniejsze w zasobach? Jeżeli definiowałeś wiele nowych map bez deletowania wcześniej tego obszaru w pamięci to owszem ALE: Poprzedni: 1.Tworzy nowy element 2.Zapisuje go do tablicy wskaźników Aktualny: 1.Tworzy tablice wszystkich elementów 2.Tworzenie dodatkowego. 3.Kopiowanie do istniejącego 4.Usuwanie chwilowego. Jeśli chodzi ci o to że wskaźnik zajmuje 4 bajty - to po kiego grzyba tworzyłeś do każdego elementu nowy wskaźnik. Nie lepiej jeden wskaźnik na obszar pamięci: cBlok( * mapa )[ size ][ size ];
mapa = new cBlok[ size ][ size ];
i żadnych pętli nie musi być!! Kompiler nie będzie miał pretensji (tylko 4 bajty - jeden wskaźnik)... A przy wykorzystaniu opcji zapisania rozmiaru mapy po czym mnożenia (przy odnoszeniu się do elementów) mógłbyś nawet zrobić mape o dynamicznym rozmiarze - koniec z wszywaniem wartości w programy. |
|
Schulze13 Temat założony przez niniejszego użytkownika |
» 2012-06-21 16:43:27 Wiem, że się nie wtrącasz. Po przeczytaniu również mnie to wstrząsnęło. to po kiego grzyba tworzyłeś do każdego elementu nowy wskaźnik. |
Gdyż nie wiedziałem o takiej możliwości. Więc jeśli dobrze rozumuje ( * tablica )[][] oznacza wskaźnik do tablicy, a * tablica[][] tablice wskaźników. Co do tablicy obiektów gdzie ilość kroków do wykonania jest większa niż w przypadku tablicy wskaźników do obiektów, pozwolę sobie stwierdzić, że tablica obiektów jest oszczędniejsza w zasobach, lecz nie przekłada się na prędkość tworzenia. Rzeczywiste wartości zużywanej pamięci przez program z Kompiler nie będzie miał pretensji |
Oj ma :). I tu nie mam pojęcia co zrobić. mapa = new cBlok[ size ][ size ]; error C2440: '=' : cannot convert from 'cBlok (*)[256]' to 'cBlok (*)[256][256]' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast |
|
Admixior |
» 2012-06-21 22:51:04 Ups. Pomyłkę zrobiłem. Definicja w klasie powinna wyglądać tak: "cBlok( * mapa )[ size ];" |
|
Schulze13 Temat założony przez niniejszego użytkownika |
» 2012-06-23 21:22:16 Działa. Dziękuje, co ja bym zrobił gdyby nie Ty :).
|
|
1 « 2 » |