Wskaźniki z dwoma gwiazdkami
Ostatnio zmodyfikowano 2014-03-12 11:27
pekfos |
» 2014-03-11 16:19:05 Nie, bo nie zwalniasz pamięci. |
|
mateuszq Temat założony przez niniejszego użytkownika |
» 2014-03-11 17:58:39 Zrobilem to w taki sposób ale nie kompiluje sie niestety i nie wiem w czym jest błąd. Pamięć powinienem chyba zwolnic w funkcji która tworzy macierz prawda? Chcialem zrobic to w taki sposob aby przypisac utworzona macierz do nowej tablicy wskaznikow a nastepnie usunac tą pierwsza jednak to nie działa, co robie nie tak? #include<iostream> #include<cstdlib> #include<conio.h> #include<ctime>
using namespace std;
int ** generuj( int & n ) { cout << "podaj stopien macierzy: "; cin >> n; int *( * tab ); tab = new int *[ n ]; for( int k = 0; k < n; k++ ) { tab[ k ] = new int[ n ]; } for( int i = 0; i < n; i++ ) { for( int j = 0; j < n; j++ ) { tab[ i ][ j ] = rand() % 100 + 1; } } int *( * tab2 ); tab2 = tab; for( int k = 0; k < n; k++ ) { delete[] tab[ k ]; } delete[] tab; return tab2; }
void wypisz( int n, int ** tab ) { for( int i = 0; i < n; i++ ) { cout << endl; for( int j = 0; j < n; j++ ) { cout << tab[ i ][ j ] << " "; } } }
int main() { int n = 0; int *( * m1 ); m1 = generuj( n ); wypisz( n, m1 ); _getch(); return 0; }
|
|
pekfos |
» 2014-03-11 18:45:05 Pamięć powinienem chyba zwolnic w funkcji która tworzy macierz prawda? |
Nie. Po zwolnieniu macierzy nie możesz jej dalej używać. |
|
michal11 |
» 2014-03-11 18:49:47 Popracuj nad lepszym formatowanie kodu, bo oczy mnie bolą od czytania tego. |
|
mateuszq Temat założony przez niniejszego użytkownika |
» 2014-03-11 19:16:44 pekfos w takim razie mam zwolnic pamiec na koncu funkcji main()?
michał11 ale o co ci konkretniej chodzi co ci sie tak nie podoba w tym kodzie? Ciągle się ucze wiec prosze o jakiej konkretniejsze informacje :) |
|
michal11 |
» 2014-03-11 19:46:55 Przede wszystkim dawaj więcej enterów takie cos cin >> n; int *( * tab ); tab = new int *[ n ]; for( int k = 0; k < n; k++ ) { tab[ k ] = new int[ n ]; }
jest dla mnie przynajmniej dość nieczytelne, spróbuj tak: cin >> n;
int *( * tab ); tab = new int *[ n ];
for( int k = 0; k < n; k++ ) { tab[ k ] = new int[ n ]; }
A co do pamięci. Zasada jest taka, że jak alokujesz pamięć operatorem new to musisz ją też zwolnić. I to od ciebie zależy kiedy to zrobisz, na tym właśnie polega dynamiczna alokacja. Ale jeżeli zwolnisz pamięć, w tym wypadku tą tablicę, i później będziesz chciał się do niej odwołać to wywołasz błąd pamięci. A i jeszcze jedno jak alokujesz pamięć 2 wymiarową, to najpierw musisz zwolnić jakby pierwszy wymiar a później 2 wymiar, ponieważ tablice 2 wymiarowe realizowane są jako tablica tablic. W pseudokodzie to by wyglądało mniej więcej tak. for( i = 0; i < liczba el 1 wymiaru; i++ ) { delete[] tablica[ i ]; }
delete[] tablica
Edit: W sumie to nie wiem co ma oznaczać konstrukcja int *( * tab ); po co są te nawiasy ? |
|
mateuszq Temat założony przez niniejszego użytkownika |
» 2014-03-11 21:17:41 Co do estetyki masz racje przyda sie wiecej enterow i spacji rzeczywiscie jest czytelniej :) jesli chodzi o nawiasy to sam nie wiem chyba gdzies to zobaczyłem po prostu. Dzieki wielkie za pomoc, bede dalej probowal robic :) |
|
michal11 |
» 2014-03-11 21:33:05 Dodam tylko, ze te nawiasy również utrudniają szybkie przeczytanie i zrozumienie kodu. |
|
1 « 2 » 3 |