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

[C++] Kopiowanie tablic dynamicznych

Ostatnio zmodyfikowano 2014-05-21 16:12
Autor Wiadomość
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
C/C++
#include <iostream>
2 # include < cstdlib >
3 using namespace std;
4 int main()
5 {
    6 int
    7 ** wskaznik_1,
    8 ** wskaznik_2;
    9
    10 //rezerwacja pamieci dla wskaznik_1
    11 wskaznik_1 = new int *[ 10 ];
    12 for( int i = 0; i < 10; i++ )
         13 wskaznik_1[ i ] = new int[ 11 ];
   
    14
    15 //zapelnienie 1
    16 for( int i = 0; i < 10; i++ )
    17 for( int z = 0; z < 11; z++ )
         18 wskaznik_1[ i ][ z ] = 1;
   
    19 //wyswietlanie
    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 // dla wskaznik_2 w ten sam sposob rezerwacja pamieci  
    28 //....
    29
    30 wskaznik_2 = wskaznik_1;
    31
    32 //kasowanie wskaznik_1 
    33 for( int i = 0; i < 10; i++ )
         34 delete[] wskaznik_1[ i ];
   
    35 delete[] wskaznik_1;
    36
    37 //wskaznik_2 juz nie wyswietla tego co bylo w wskaznik_1       
    38
    39 system( "pause" );
    40 return 0;
    41 }

Próbowałem to zrobić w taki sposób:
C/C++
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
P-110448
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:)
P-110449
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ć:
C/C++
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:
C/C++
wskaznik_2 = wskaznik_1;
jak zwolnie pamieć wskaznik_1 to wskaznik_2 też muszę? Czy ona już sie sama zwolni :)
P-110450
maly
» 2014-05-20 11:52:22
C/C++
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ęć.
P-110451
libed
» 2014-05-20 13:52:57
Jeśli potraktujesz tablicę dwuwymiarową jako jednowymiarową to będziesz mógł wszystko przekopiować jednym memcpy.
P-110463
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.
P-110492
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.
P-110528
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?
C/C++
memcpy( wskaznik_2, wskaznik_1, sizeof( int ) );
 Czy jeszcze coś innego masz na myśli?
P-110568
« 1 » 2
  Strona 1 z 2 Następna strona