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

[C++] Zawieszenie programu przy wywołaniu destruktora

Ostatnio zmodyfikowano 2012-11-28 21:42
Autor Wiadomość
tygryseks
Temat założony przez niniejszego użytkownika
» 2012-11-14 20:46:39
crash Twoje zmiany co prawda spowodowały że program dodaje macierze ale niestety zawiesza się na sam koniec tj. gdy nacisnę Enter - Aby kontynuować naciśnij dowolny klawisz.
P-69273
ison
» 2012-11-14 22:20:38
Najlepiej jakbyś w dodaj_macierz przekazywał jako kolejny argument referencję do macierzy, do której chcesz zapisać wynik.

C/C++
Macierz a, b, c;
a.dodaj_macierz( b, c ); // a + b
P-69277
Admixior
» 2012-11-14 23:24:29
Uno:@crash: w destruktorze zapomniałeś o [] przy delete w pętli :"delete[] tab_m[ i ];"
Duo: jeśli spróbujemy dodać macierze a.dodaj_maczierz(b);  gdzie b ma mniejszą tablicę wówczas dodawać będą się śmieci, a jak wyjdziemy po za blok pamięci to program się zcrashuje.
Gorsza sytuacja jest w operatorze= który napisał crash. Jeżeli damy "A=B" i (B.m_size < A.m_size) wówczas dzieje się to co wyżej (śmieci i ew. crash), jeżeli na odwrót B=A; wtedy nadpiszemy pamięć która należy do naszego programu tym co było w B. Dlatego że przed pętlą jest brutalnie umieszczona instrukcja
this->m_size=M.m_size;.

Co prawda w main jest wykorzystywany tylko domyślny rozmiar 2, ale w przyszłości... należałoby pomyśleć nad realokacją.
P-69281
crash
» 2012-11-17 19:43:19
Polałbym Ci bo dobrze prawisz. Zważ jednak, że autor tematu nie implementował obsługi błędów, ani o nią nie prosił ;p
Co do kodu - przyznaję, troszkę pisałem na pałę. Liczą się chęci %-D
P-69426
tygryseks
Temat założony przez niniejszego użytkownika
» 2012-11-28 21:42:49
Udało mi się ukończyć program i wreszcie wszystko działa jak należy.
Dzięki za zainteresowanie. Podaję kod może komuś się przyda.


C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

class Macierz
{
private:
    string nazwa;
    int m_size;
    double ** tab_m;
public:
   
    Macierz( string nazwa, int = 2 ); // konstruktor
    ~Macierz(); // destruktor
   
    void wypelnij_macierz();
    void wypisz_macierz();
    Macierz * dodaj_macierz( Macierz * m2 );
   
};

Macierz::Macierz( string nazwa2, int size )
{
    nazwa = nazwa2;
    m_size = size;
    tab_m = new double *[ m_size ];
   
    for( int i = 0; i < m_size; i++ )
         tab_m[ i ] = new double[ size ];
   
}

Macierz::~Macierz()
{
    for( int i = 0; i < m_size; i++ )
         delete[] tab_m[ i ];
   
    delete[] tab_m;
    cout << "Wywolanie destruktora macierzy o nazwie: " << nazwa << endl;
}

void Macierz::wypelnij_macierz()
{
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            cout << "Wprowadz wartosc do macierzy " << nazwa << " [ " << i << " ][ " << j << " ] : ";
            cin >> tab_m[ i ][ j ];
           
        }
    }
}

void Macierz::wypisz_macierz()
{
    cout << "Macierz " << nazwa << endl;
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            cout << tab_m[ i ][ j ] << " ";
        }
        cout << endl;
    }
}

Macierz * Macierz::dodaj_macierz( Macierz * wsk_m2 )
{
    cout << "Dodaje macierze  \n";
    cout << "Wynik dodawania: \n";
    Macierz * wsk_suma = new Macierz( "SUMA" );
   
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            wsk_suma->tab_m[ i ][ j ] = tab_m[ i ][ j ] + wsk_m2->tab_m[ i ][ j ];
        }
    }
    return wsk_suma;
}


int main()
{
    //Deklaracja obiektów klasy Macierz
    Macierz * wsk_A, * wsk_B, * wsk_suma;
   
    wsk_A = new Macierz( "A" );
    wsk_B = new Macierz( "B" );
   
    // Pobranie danych do macierzy
    wsk_A->wypelnij_macierz();
    cout << endl;
    wsk_B->wypelnij_macierz();
    cout << endl;
   
    // Wyswietlenie podanych macierzy w celu sprawdzenia
    cout << "Podane dane: \n\n";
    wsk_A->wypisz_macierz();
    cout << endl;
    wsk_B->wypisz_macierz();
    cout << endl;
   
   
    // Dodawanie macierzy
    wsk_suma = wsk_A->dodaj_macierz( wsk_B );
    cout << endl;
    wsk_suma->wypisz_macierz();
    cout << endl;
   
    delete wsk_A;
    delete wsk_B;
    delete wsk_suma;
   
   
    system( "PAUSE" );
    return 0;
}
[ \c pp ]
P-70092
1 « 2 »
Poprzednia strona Strona 2 z 2