[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ł ;pCo 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 » |