[C++] Zawieszenie programu przy wywołaniu destruktora
Ostatnio zmodyfikowano 2012-11-28 21:42
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. |
|
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. Macierz a, b, c; a.dodaj_macierz( b, c );
|
|
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ą. |
|
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 |
|
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. #include <iostream> #include <cstdlib>
using namespace std;
class Macierz { private: string nazwa; int m_size; double ** tab_m; public: Macierz( string nazwa, int = 2 ); ~Macierz(); 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() { Macierz * wsk_A, * wsk_B, * wsk_suma; wsk_A = new Macierz( "A" ); wsk_B = new Macierz( "B" ); wsk_A->wypelnij_macierz(); cout << endl; wsk_B->wypelnij_macierz(); cout << endl; cout << "Podane dane: \n\n"; wsk_A->wypisz_macierz(); cout << endl; wsk_B->wypisz_macierz(); cout << endl; 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 ] |
|
1 « 2 » |