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

Kopiowanie Dynamicznie Allokowanej Pamięci C++

Ostatnio zmodyfikowano 2016-07-29 12:47
Autor Wiadomość
Mentaris
Temat założony przez niniejszego użytkownika
» 2016-07-27 10:42:22
Hmm, okay, no tak, zapisuje do adresu aray wartość ze wskaźnika bd, nie o to mi chodziło, chciałem zapisać wartość. No dobra, tylko że nie moge wstawić jednej gwiastki oznaczając że chodzi mi o wartość wskaźnika który jest zadeklarowany w tym wskaźniku aray. Wyżej zapisałem int **aray(a to dlatego że jak chce do wskaźnika stworzyć wskaźnik, to muszę wstawić dwie gwiazdki[z tego co czytałem]). Czyli to ma wyglądać na coś takiego *bd=**aray tak?

A jak stworzyć nową tablice dla wskaźnika który jest na zewnątrz funkcji? Jak mówiłem aray jest wskaźnikiem do colisionData który też jest wskaźnikiem. Czyli mam dać **aray=*new int[g_size]; ?

Niekiedy nawet oczywiste rzeczy można nie zauważać, jak jest się już trochę sfrustrowanym nie działaniem kodu. Najczęściej jak już wrzucam coś na forum to nie żeby ktoś za mnie zrobił, tylko w momencie gdy już jestem dość zdesperowany i sam nie ogarniam o co chodzi.
P-150295
j23
» 2016-07-27 11:05:22
@Mentaris: tak, tylko sizeof powinien zwrócić wielkość elementu tablicy (czyli jego typu). Teraz masz tam wskaźnik, a nie typ int. Na 32-bitach to zadziała, bo wielkość wskaźnika i typu int jest taka sama, ale w 64-bitach na visualu będzie problem, bo tam, jeśli dobrze pamiętam, int ma wielkość 4 a wskaźnik 8 bajtów, zatem memset wyjdzie poza zakres bloku pamięci.
P-150296
pekfos
» 2016-07-27 12:03:38
Hmm, okay, no tak, zapisuje do adresu aray wartość ze wskaźnika bd, nie o to mi chodziło, chciałem zapisać wartość. [..] Czyli to ma wyglądać na coś takiego *bd=**aray tak?
Co? Aktualna ilość gwiazdek jest dobra. *bd = **aray to przypisanie liczb bezpośrednio wskazywanych przez wskaźniki bd i *aray. bd = *aray to działanie na samych wskaźnikach. W tej funkcji potrzebujesz obu rodzajów działań (chyba, że nie będziesz ręcznie kopiować danych, tylko użyjesz np memcpy()).
P-150297
Mentaris
Temat założony przez niniejszego użytkownika
» 2016-07-27 12:04:04
@j23 A to już rozumiem, czyli i_colD*sizeof(int). Dzięki za pomoc ziom. : ]

@pekfos Czyli *aray zapisuje adres colisionData, a **aray zapisuje jego wartość? To dobrze myślę, do bd chce tylko skopiować wartości, a *aray czyli colisionData chce powiekszyć o nowe miejsca w tablicy i kopiując z powrotem do **aray czyli do tablicy colisionData wartości z bd. Chyba że się tak nie da, a ty próbujesz mi wytłumaczyć coś innego.
P-150298
pekfos
» 2016-07-27 20:38:16
kopiując z powrotem do **aray
Po co kopiować 2 razy?
C/C++
void f( int ** array )
{
    int * bd = * array;
    * array = new int[ nowy_rozm ];
   
    // bd - stary blok pamięci
    // *array - nowy blok pamięci
   
    // skopiuj dane spod bd do *array i zwolnij bd.
}
P-150324
Mentaris
Temat założony przez niniejszego użytkownika
» 2016-07-28 21:43:15
Dobra głupio mi sie przyznać ale próbowałem tyle już różnych sposobów, jednak nic nie zadziałało. Powinno działać, nie ogarniam czemu nie działa. Sam spójrz:


void DAMChanger(int **aray, int g_size)
{
int * bd = *aray;  // tutaj tak zrobiłem jak napisałeś że tworząc bd przepisałem wszystko co jest w aray
*aray = new int(g_size); // zwiększenie miejsca
memset(*aray, 0, g_size * sizeof(int)); // ustawienie całej pamięci na null
for (int i = 0; i < g_size - 3; i++) // kopiowanie do *araya czyli colisionData liczb z bd.
*aray[i] = bd[i];
delete bd; // zwalnianie pamieci
bd = nullptr;
}
-3 dlatego że wielkość została zwiekszona o 3, czyli tamta pamięc nie jest aż tak wielka wiec moglo by wyjść poza zakres tablicy

Robiłem jeszcze tak:

void DAMChanger(int **aray, int g_size)
{
int * bd = *aray;  // tutaj tak zrobiłem jak napisałeś że tworząc bd przepisałem wszystko co jest w aray
*aray = new int(g_size); // zwiększenie miejsca
memset(*aray, 0, g_size * sizeof(int)); // ustawienie całej pamięci na null
memcpy(*aray, bd, g_size*sizeof(int)); // tutaj też sprawdzałem z wersją (g_size-3)*sizeof(int) z ampersandami i bez nich
delete bd; // zwalnianie pamieci
bd = nullptr;
}
i już nawet to: (choć dla mnie nie logiczne by było, gdyby wartości się skopiowały).

void DAMChanger(int **aray, int g_size)
{
int * bd = *aray;  // tutaj tak zrobiłem jak napisałeś że tworząc bd przepisałem wszystko co jest w aray (nawet nie wiedziałem że tak można)
*aray = new int(g_size); // zwiększenie miejsca
memset(*aray, 0, g_size * sizeof(int)); // ustawienie całej pamięci na null
*aray=bd; // kopiowanie
delete bd; // zwalnianie pamieci
bd = nullptr;
}
Sprawdzałem też z memsetem, bez memseta, z delete [] bd, bez niego, no kurde tyle różnych wariantów i nic. Sprawdziłem tak jak napisałem, nawet te sposoby które wydawały mi się nie logiczne.
Źle myśle czy jak?
P-150351
j23
» 2016-07-29 09:58:22
Popraw *aray = new int(g_size); na *aray = new int[g_size]; i delete bd; na delete[] bd;.
P-150352
Mentaris
Temat założony przez niniejszego użytkownika
» 2016-07-29 12:47:23
@j23 o kurde, że ja tych głupich nawiasów nie zauważyłem, ehh. Jeszcze raz dzięki ; ).

@pakfos Też dzięki wielkie, ciesze się że miałeś tą cierpliwość (a pewnie trzeba było dużej). : D

Problem rozwiązany.
P-150361
1 « 2 »
Poprzednia strona Strona 2 z 2