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

new char dla tablic dwuwymiarowych

Ostatnio zmodyfikowano 2011-05-21 17:57
Autor Wiadomość
ison
» 2011-05-20 20:30:48
C/C++
char ** CreateDoubleArray( const int w, const int h ) {
    char ** ret = new char *[ w ];
    for( int i = 0; i < w; ++i ) {
        ret[ i ] = new char[ h ];
    }
    return ret;
}

void DestroyDoubleArray( int ** Array, const int w ) {
    for( int i = 0; i < w; ++i ) {
        delete[] Array[ i ];
    }
    delete[] Array;
}

użycie:
C/C++
char ** array = CreateDoubleArray( 100, 100 ); //rozmiar 100x100
...
DestroyDoubleArray( array, 100 );
P-33240
absflg
» 2011-05-20 23:13:47
Możesz też korzystać z tablicy jednowymiarowej jak z dwuwymiarowej:
C/C++
int rozmiar_x, rozmiar_y, x, y, nr; //jakiekolwiek przypisanie

int * tab = new int[ rozmiar_x * rozmiar_y ];
//tworzenie

tab[ y * rozmiar_x + x ];
//odwołanie się do komórki [x][y]

y = int( nr / rozmiar_x );
x = nr % rozmiar_x;
//wyliczanie jakie współrzędne w dwóch wymiarach ma komórka o numerze 'nr' na tablicy jednowymiarowej
P-33244
Mrowqa
» 2011-05-21 14:24:34
ehh ...
C/C++
char( * tab )[ 10 ]; // musi być stała, więc daj wystarczająco dużo :P
int n;
cin >> n;
tab = new char[ n ][ 10 ];
Dalej korzystasz jak ze zwykłej tablicy 2D. Element który oznaczyłem musi być podany w trakcie kompilacji. Mimo tego ograniczenia zazwyczaj to starcza ^^ Jeśli Ci to nie pomoże - będziesz musiał się męczyć nad tym co koledzy wyżej Ci napisali :P

Pozdrawiam,
Mrowqa
P-33250
absflg
» 2011-05-21 15:25:51
Takie dwuwymiarowe się raczej do niczego nie przydają. Trudno mówić o "raczej wystarczy" gdy nie wiemy do czego to ma służyć. Głupotą by było dla powierzchni kwadratowej o rozmiarach w zakresie 10x10 do 2500x2500 rezerwować na zapas 5000x5000 w pamięci na każdą (i jeszcze sztuczne przez to ograniczanie wielkości tej tablicy). Przy dużej ilości takich pseudomałych tablic może się stać to widoczne.
P-33252
Mrowqa
» 2011-05-21 16:55:33
@up
Nie wiem jak inni, ale ja jeśli potrzebuje np. dynamicznie zaalokować tablicę 10x8x32 to po prostu tworzę specjalny wskaźnik i jadę z koksem. Tzn. tworzę to, co na daną chwilę jest potrzebne i oszczędzam w miarę pamięć :P Nic nie mówię o tym, że tworzę tablicę 5000x5000 i raz jej użyję do tego a innym razem do tego ... po prostu tworzę wskaźnik ( a on mało zajmuje ) i operatorem new alokuję sobie tablicę wystarczająco dużą na daną chwilę. ( To na szczęście u mnie nie jest często operacja :P więc zazwyczaj to starcza ^^ ).

gdy nie wiemy do czego to ma służyć.
Wnioskując po tych słowach alokujesz tablicę nawet nie wiedząc do czego ma służyć tylko tak po prostu bo Ci się tak podoba. Nie wiem jak inni ( bo może to ja jestem jakiś inny :P ), ale ja alokuję tablicę w jakimś celu. Wtedy wiem, jaki wskaźnik przygotować ( a jak wszyscy wiemy - wskaźnik jest lekki ( mało zajmuje w pamięci ), więc chyba lepiej zrobić sobie kilka wskaźników niż zbędnie wielką tablicę ).

Pozdrawiam,
Mrowqa
P-33260
absflg
» 2011-05-21 17:36:45
@up
W pierwszym poście było, że tablica ma być kwadratowa, a jej wielkość niewpisana w program. Należałoby więc jako stałą podać wielkość maksymalną tablicy. Takie tworzenie tablicy wielowymiarowej ma sens tylko gdy pozostałe wymiary są ściśle ustalone.

I oczywiście, że nie wiemy do czego ma służyć, gdyż autor tematu nic o tym nie napisał. Należałoby więc przyjąć, że tablica ta może mieć dowolny rozmiar. A trudno przecież w przypadku stałej mówić o dowolności.
P-33265
Mrowqa
» 2011-05-21 17:57:57
@up
Wiesz, to co ja napisałem to była taka mała rada ode mnie, a nie rozwiązanie :P Tak po za tym nigdzie tam nie widzę czegoś o tym, że ma być kwadratowa ... nie sugeruj się tym, że dał tam [ n ][ n ], a pozostali tworzyli właśnie kwadratowe tablice. Może i autorowi chodzi o tablicę kwadratową, aczkolwiek o tym nie wspomniał!!! ( a ty piszesz, że wspomniał po to... właśnie po co ?? :P by zlikwidować mój błyskliwy pomysł ? :D ). Tak jak nie wspomniał o tablicy kwadratowej, tylko o dwuwymiarowej tak ja poddałem pomysł stworzenia takowej :P Czytaj ze zrozumieniem :D

Pozdrawiam,
Mrowqa
P-33267
1 « 2 »
Poprzednia strona Strona 2 z 2