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

Wskaźniki z dwoma gwiazdkami

Ostatnio zmodyfikowano 2014-03-12 11:27
Autor Wiadomość
pekfos
» 2014-03-11 16:19:05
Nie, bo nie zwalniasz pamięci.
P-106104
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?
C/C++
#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;
}
P-106115
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ć.
P-106118
michal11
» 2014-03-11 18:49:47
Popracuj nad lepszym formatowanie kodu, bo oczy mnie bolą od czytania tego.
P-106119
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 :)
P-106120
michal11
» 2014-03-11 19:46:55
Przede wszystkim dawaj więcej enterów takie cos
C/C++
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:

C/C++
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.

C/C++
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 ?
P-106123
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 :)
P-106130
michal11
» 2014-03-11 21:33:05
Dodam tylko, ze te nawiasy również utrudniają szybkie przeczytanie i zrozumienie kodu.
P-106133
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona