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

Problem z wyciekiem pamięci przy macierzach

Ostatnio zmodyfikowano 2015-11-04 22:19
Autor Wiadomość
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

C/C++
#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;
    // TAB A
    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;
    }
    // TAB B
    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;
        // C1
        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;
        // C2
        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;
       
        // C2
        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;
}
P-139632
darko202
» 2015-11-04 16:53:17
P-139634
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.
P-139658
« 1 »
  Strona 1 z 1