[C++] Kopiowanie tablic dynamicznych
Ostatnio zmodyfikowano 2014-05-21 16:12
NowyCC Temat założony przez niniejszego użytkownika |
[C++] Kopiowanie tablic dynamicznych » 2014-05-20 10:48:58 Witam Mam mały problem z kopiowaniem tablic dynamicznych. Tworzę jedną tablicę dwuwymiarową i chcę skopiować do innej rownież dynamicznej a tą pierwszą skasować. Kod #include <iostream> 2 # include < cstdlib > 3 using namespace std; 4 int main() 5 { 6 int 7 ** wskaznik_1, 8 ** wskaznik_2; 9 10 11 wskaznik_1 = new int *[ 10 ]; 12 for( int i = 0; i < 10; i++ ) 13 wskaznik_1[ i ] = new int[ 11 ]; 14 15 16 for( int i = 0; i < 10; i++ ) 17 for( int z = 0; z < 11; z++ ) 18 wskaznik_1[ i ][ z ] = 1; 19 20 for( int i = 0; i < 10; i++ ) 21 { 22 for( int z = 0; z < 10; z++ ) 23 cout << wskaznik_1[ i ][ z ] << " "; 24 cout << endl; 25 } 26 27 28 29 30 wskaznik_2 = wskaznik_1; 31 32 33 for( int i = 0; i < 10; i++ ) 34 delete[] wskaznik_1[ i ]; 35 delete[] wskaznik_1; 36 37 38 39 system( "pause" ); 40 return 0; 41 }
Próbowałem to zrobić w taki sposób: wskaznik_2 = new int *[ sizeof( int ) * 10 ]; 2 for( int i = 0; i < 10; i++ ) 3 wskaznik_2 = new int[ sizeof( int ) * 11 ];
4 5 memcpy( wskaznik_2, wskaznik_1, sizeof( wskzanik_1 ) );
Ale to też nie działa :) jest jakiś prosty sposób żeby to jakoś przekopiować? Pozdrawiam |
|
maly |
» 2014-05-20 11:05:55 wskaznik_2 = wskaznik_1; wskaznik_2 wskazuje na to samo co wskaznik_1, jeśli "usuniesz" wskaznik_1 to wskaznik_2 wskazuje na usuniętą zawartość. To ode mnie taka wskazówka odnośnie wskażników:) |
|
NowyCC Temat założony przez niniejszego użytkownika |
» 2014-05-20 11:16:37 Dzięki. Teraz już wiem :P wiem że można to tak skopiować: or( int i = 0; i < 10; i++ ) 2 for( int z = 0; z < 11 ) 3 wskaznik_2[ i ][ z ] = wskaznik_1[ i ][ z ];
tylko chodzi mi o coś może bardziej porstszego jak właśnie ta funkcja memcpy(). I jeszcze chcę dopytać czy po tym zapisie: jak zwolnie pamieć wskaznik_1 to wskaznik_2 też muszę? Czy ona już sie sama zwolni :) |
|
maly |
» 2014-05-20 11:52:22 for( int i = 0; i < 10; i++ ) memcpy( wskaznik_2[ i ], wskaznik_1[ i ], sizeof( int ) * 11 ); jak zwolnie pamieć wskaznik_1 to wskaznik_2 też muszę? Czy ona już sie sama zwolni :) |
Obydwa wskazują na dokładnie tą samą pamięć. |
|
libed |
» 2014-05-20 13:52:57 Jeśli potraktujesz tablicę dwuwymiarową jako jednowymiarową to będziesz mógł wszystko przekopiować jednym memcpy. |
|
NowyCC Temat założony przez niniejszego użytkownika |
» 2014-05-20 19:24:57 Wielkie dzięki :) teraz już troche jaśniejsze jest :) Podrawiam. |
|
maly |
» 2014-05-21 07:08:00 Jeśli potraktujesz tablicę dwuwymiarową jako jednowymiarową to będziesz mógł wszystko przekopiować jednym memcpy. |
Tablice dwuwymiarowe alokowane dynamicznie nie mają spójnej pamięci czyli każde new przydzieli pamięć w dowolnym miejscu. Gdyby stworzyć tablicę jednowymiarową i traktować jak dwu można by było przy jej kopiowaniu zastosować jednokrotne memcpy. Sorki że piszę w zamkniętym ale nie dawało mi to spokoju. |
|
NowyCC Temat założony przez niniejszego użytkownika |
» 2014-05-21 15:35:17 Gdyby stworzyć tablicę jednowymiarową i traktować jak dwu można by było przy jej kopiowaniu zastosować jednokrotne memcpy. |
Możesz to trochę dokładniej wytłumaczyć? Bo nie wiem czy dobrze to rozumiem:) Chodzi o taki zapis? memcpy( wskaznik_2, wskaznik_1, sizeof( int ) );
Czy jeszcze coś innego masz na myśli? |
|
« 1 » 2 |