Problem z wyciekiem pamięci przy macierzach
Ostatnio zmodyfikowano 2015-11-04 22:19
skullek Temat założony przez niniejszego użytkownika |
Problem z wyciekiem pamięci przy macierzach » 2015-11-04 16:02:39 Witam dopiero zaczynam przygodę z programowaniem (Zajmuje się tym z 2-3 tygodnie), mam takie zadanie: " zapisane są liczby całkowite a1, a2, b1 i b2. Utwórz i zapełnij losowymi liczbami z przedziału [-5 ; 5] dwie macierze prostokątne: A[a1, a2] i B[b1, b2]. Następnie utwórz macierze: - C1 = A + B, - C2 = A – B oraz - C3 = A * B. Przed podjęciem działań, sprawdź ich wykonalność! Do generacji losowych wartosci macierzy A i B użyj generatora liczb pseudolosowych. " Problem polega na tym, że średnio ogarniam wskaźniki i alokacje pamięci a ciągle wyskakuje mi błąd o wycieku, nie wiem czemu. Musi to byc zrobione malloc/calloc - takie dostałem polecenie #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
int main() { srand( time( NULL ) ); int tabAN, tabAM, tabBN, tabBM; int ** tabA, ** tabB; int i, j; cout << "TABLICA A:" << endl << "Ile kolumn: "; cin >> tabAN; cout << "Ile wierszy: "; cin >> tabAM; tabA =( int ** ) malloc( tabAM * sizeof( int * ) ); for( i = 0; i < tabAM; i++ ) { tabA[ i ] =( int * ) malloc( tabAN * sizeof( int ) ); } for( int i = 0; i < tabAM; i++ ) { for( int j = 0; j < tabAN; j++ ) { tabA[ i ][ j ] = rand() % 10 - 5; cout << tabA[ i ][ j ] << " "; } cout << endl; } cout << "TABLICA B:" << endl << "Ile kolumn: "; cin >> tabBN; cout << "Ile wierszy: "; cin >> tabBM; tabB =( int ** ) malloc( tabBM * sizeof( int * ) ); for( i = 0; i < tabBM; i++ ) { tabB[ i ] =( int * ) malloc( tabBN * sizeof( int ) ); } for( int i = 0; i < tabBM; i++ ) { for( int j = 0; j < tabBN; j++ ) { tabB[ i ][ j ] = rand() % 10 - 5; cout << tabB[ i ][ j ] << " "; } cout << endl; } int ** C1 =( int ** ) malloc( tabAM * sizeof( int ) ); int ** C2 =( int ** ) malloc( tabAM * sizeof( int ) ); int ** C3 =( int ** ) malloc( tabAM * sizeof( int ) ); if( tabAM == tabBM && tabAN == tabBN ) { for( int i = 0; i < tabAM; i++ ) { C1[ i ] =( int * ) malloc( tabAN * sizeof( int ) ); C2[ i ] =( int * ) malloc( tabAN * sizeof( int ) ); C3[ i ] =( int * ) malloc( tabAN * sizeof( int ) ); for( int j = 0; j < tabAN; j++ ) { C1[ i ][ j ] = tabA[ i ][ j ] + tabB[ i ][ j ]; C2[ i ][ j ] = tabA[ i ][ j ] - tabB[ i ][ j ]; C3[ i ][ j ] = 0; C3[ i ][ j ] = tabA[ i ][ j ] * tabB[ i ][ j ]; } } cout << "C1 + " << endl << endl; for( int i = 0; i < tabAM; i++ ) { for( int j = 0; j < tabAN; j++ ) { cout.width( 4 ); cout << C1[ i ][ j ]; } cout << endl << endl; } cout << "C2 -" << endl << endl; for( int i = 0; i < tabAM; i++ ) { for( int j = 0; j < tabAN; j++ ) { cout.width( 4 ); cout << C2[ i ][ j ]; } cout << endl << endl; } cout << "C3 *" << endl << endl; for( int i = 0; i < tabAM; i++ ) { for( int j = 0; j < tabAN; j++ ) { cout.width( 4 ); cout << C3[ i ][ j ]; } cout << endl << endl; } } else cout << "Macierze sa niezgodne" << endl; for( int z = 0; z < tabAM; z++ ) free( tabA[ z ] ); free( tabA ); for( int z = 0; z < tabBM; z++ ) free( tabB[ z ] ); free( tabB ); free( C1 ); free( C2 ); free( C3 ); system( "pause" ); return 0; } |
|
darko202 |
» 2015-11-04 16:53:17 |
|
Maciek |
» 2015-11-04 22:19:05 Ok, musi to być malloc/alloc, ale o ile nikt nie zabronił ci stworzenie kontenera, to ja bym proponował ci zaprojektować klasę która będzie ci zarządzała pamięcią, coś na wzór kontenera z biblioteki standardowej, jest też biblioteka blitz++ http://sourceforge.net/projects/blitz/ zaprojektowana do obliczeń numerycznych, możesz zerknąć na nią i do dokumentacji, może coś cię zainspiruje i napiszesz taki kontener który rozwiąże twoje problemy. Pozdrawiam. |
|
« 1 » |