Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Spore tablice wielowymiarowe

Ostatnio zmodyfikowano 2012-06-23 21:22
Autor Wiadomość
Schulze13
Temat założony przez niniejszego użytkownika
» 2012-06-20 16:05:56
Poczytałem. Zmieniłem mechanizm tworzenia mapy
C/C++
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)/\,,)

C/C++
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 = NULL;
    }
}
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)
P-58766
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.
P-58773
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)/\,,)
C/C++
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:
C/C++
//cBlok *ptrB; // stało się niepotrzebne
cBlok( * mapa )[ size ][ size ]; //wskaźnik na tablice 2 wymiarową gdzie to drugie size ma znaczenie (pierwszego nie musi być: "(*mapa)[][ size ]")

//a później
/*for( int i = 0; i < size; i++ )
{
    for( int j = 0; j < size; j++ )
    {
        ptrB = new cBlok();
        mapa[ i ][ j ] = * ptrB;
        delete ptrB;
       
        //ptrB = NULL;
    }
}*/
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.
P-58776
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
Tablicą wskaźników do obiektów 21 736 K
Tablicą obiektów20 004 K

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


 
P-58843
Admixior
» 2012-06-21 22:51:04
Ups. Pomyłkę zrobiłem. Definicja w klasie powinna wyglądać tak: "cBlok( * mapa )[ size ];"
P-58864
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 :).

P-58999
1 « 2 »
Poprzednia strona Strona 2 z 2