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. |
|
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. |
|
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()). |
|
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. |
|
pekfos |
» 2016-07-27 20:38:16 kopiując z powrotem do **aray |
Po co kopiować 2 razy? void f( int ** array ) { int * bd = * array; * array = new int[ nowy_rozm ]; } |
|
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? |
|
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;. |
|
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. |
|
1 « 2 » |