mackol Temat założony przez niniejszego użytkownika |
[c++]Modyfikacja dynamicznej tablicy przez przepisanie adresu/wskaznika... » 2014-05-15 23:26:10 Witam, mam problem z poniższym kodem, mógł by mi ktoś wyjaśnić dlaczego jakakolwiek próba modyfikacja tablicy z poziomu funkcji nie przynosi skutku? W funkcji dynamicznie tworzę tablice o x rozmiarze i chciałbym podmienić istniejącą tablice na nową poprzez przepisanie wskaźnika, w ciele main ten sposób działa, w osobnej funkcji już nie :/ #include <cstdlib> #include <iostream>
using namespace std;
void mod_tab( int * tab ) { int * nowy = new int[ 1 ]; nowy[ 0 ] = 66666; tab = nowy; }
int main( int argc, char ** argv ) { int * tablica = new int; int * nowy = new int[ 1 ]; nowy[ 0 ] = 11111; tablica = nowy; mod_tab( tablica ); printf( "%d\n", tablica[ 0 ] ); return 0; }
|
|
OSA_PL |
» 2014-05-15 23:36:35 W twojej funkcji masz dostęp tylko do lokalnej kopii wartości zapisanej we wskaźniku, a żeby zmienić wartość we wskaźniku, który przekazujesz potrzebujesz jego adresu w pamięci - przekazuj wskaźnik przez referencje/wskaźnik. |
|
mackol Temat założony przez niniejszego użytkownika |
» 2014-05-16 11:01:49 No ok. teraz cos się zmieniło ale nadal nie mogę uzyskać pożądanego efektu: #include <cstdlib> #include <iostream>
using namespace std;
void mod_tab( int & tab, int i ) { int * nowy = new int[ i ]; nowy[ 0 ] = 11; nowy[ 1 ] = 99; tab = * nowy; }
int main( int argc, char ** argv ) { int * tablica = new int; mod_tab( * tablica, 2 ); printf( "%d\n", tablica[ 0 ] ); printf( "%d\n", tablica[ 1 ] ); return 0; }
Chciałbym za pomocą funkcji tworzyć dynamicznie nową tablice o określonym rozmiarze i przypisywać jej zawartość do wcześniej zdefiniowanej tablicy w main...? |
|
OSA_PL |
» 2014-05-16 11:46:42 void mod_tab( int *& tab, int i ) { int * nowy = new int[ i ]; nowy[ 0 ] = 11; nowy[ 1 ] = 99; tab = nowy; }
|
|
Monika90 |
» 2014-05-16 11:50:10 A nie wpadłeś na to, że jak chcesz coś zwrócić z funkcji, to deklarujesz funkcję z odpowiednim typem zwracanym i używasz return? Przykład std::vector < int > mod_tab( int size ) { std::vector < int > tab( size ); return tab; }
W ogóle w C++ nie robi się tablic dynamicznych w taki sposób, używaj kontenerów (najlepiej vectora), albo inteligentnych wskaźników (i to bez jawnego użycia new): auto tab = std::make_unique < int[] >( size );
|
|
maly |
» 2014-05-16 12:08:35 std::make_unique ciekawa opcja ale C++14 !!! |
|
mackol Temat założony przez niniejszego użytkownika |
» 2014-05-16 14:19:33 To nie jest rzeczywisty problem tylko "akademicki", muszę użyć zwykłych wskaźników, żadnych vektorów, żadnego STL-a... void mod_tab( int *& tab, int i ) { int * nowy = new int[ i ]; nowy[ 0 ] = 11; nowy[ 1 ] = 99; delete[] tab; tab = nowy; }
mam jeszcze jedno pytanie dlaczego nie działa zwalnianie pamięci z poziomu funkcji - delete[] tab; |
|
OSA_PL |
» 2014-05-16 16:23:09 A po czym wnioskujesz, że nie działa? |
|
« 1 » 2 |