Klasa z macierzą double o wymiarach 2*2. [Błąd]
Ostatnio zmodyfikowano 2015-06-07 00:34
Barry93 Temat założony przez niniejszego użytkownika |
Klasa z macierzą double o wymiarach 2*2. [Błąd] » 2015-06-05 22:03:45 Treść zadania "Klasa z macierzą double o wymiarach 2*2. Klasa powinna zawierać m.in. konstruktor inicjujący macierz, funkcje Dodaj_Macierz(),Odejmij macierz(), Pomnoz_macierz(), Wypisz_macierz(). " Program działał mi i kompilował się do momentu dodawania, gdy dodałem już mnożenie program się crashował. Nie wiem czy to błąd pamięci? Jest ktoś w stanie mi pomóc? #include <iostream> #include <stdio.h> #include <cstdlib> #include <string.h>
using namespace std;
class Macierz { private: int m_size; double ** tab_m; public: Macierz( int = 2 ); ~Macierz(); void wypelnij_macierz(); void wypisz_macierz(); Macierz dodaj_macierz( Macierz & m2 ); Macierz pomnoz_macierz( Macierz & m2 ); Macierz & operator =( const Macierz & ); };
Macierz & Macierz::operator =( const Macierz & M ) { this->m_size = M.m_size; for( int i = 0; i < m_size; ++i ) for( int j = 0; j < m_size; ++j ) this->tab_m[ i ][ j ] = M.tab_m[ i ][ j ]; }
Macierz::Macierz( int size ) { 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; }
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 [ " << i << " ][ " << j << " ] : "; cin >> tab_m[ i ][ j ]; } } }
void Macierz::wypisz_macierz() { 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 & m2 ) { cout << "Dodaje macierze \n"; cout << "Wynik dodawania: \n"; Macierz suma = * this; for( int i = 0; i < m_size; i++ ) { for( int j = 0; j < m_size; j++ ) { suma.tab_m[ i ][ j ] = tab_m[ i ][ j ] + m2.tab_m[ i ][ j ]; } } return suma; }
Macierz Macierz::pomnoz_macierz( Macierz & m2 ) { cout << "Mnoze macierze \n"; cout << "Wynik mnozenia: \n"; Macierz suma = * this; double s = 0; for( int i = 0; i < m_size; i++ ) { for( int j = 0; j < m_size; j++ ) { for( int k = 0; k < m_size; k++ ) suma.tab_m[ i ][ j ] +=( tab_m[ i ][ k ] * m2.tab_m[ k ][ j ] ); } } return suma; }
int main() { Macierz m1, m2, suma; m1.wypelnij_macierz(); cout << endl; m2.wypelnij_macierz(); cout << endl; cout << "Podane dane: \n\n"; m1.wypisz_macierz(); cout << endl; m2.wypisz_macierz(); cout << endl; suma = m1.dodaj_macierz( m2 ); cout << endl; suma.wypisz_macierz(); cout << endl; suma = m1.pomnoz_macierz( m2 ); cout << endl; suma.wypisz_macierz(); cout << endl; system( "PAUSE" ); return 0; } |
|
Monika90 |
» 2015-06-05 22:25:13 Kod daj pomiędzy znaczniki [cpp][/cpp]
Przecież ma być 2x2 więc po co te wskaźniki?
Jeżeli używasz wskaźników w taki sposób w jaki ich używasz, to klasa powinna mieć zdefiniowany konstruktor kopiujący i operator przypisania, ten ostatni masz, ale błędny. |
|
Barry93 Temat założony przez niniejszego użytkownika |
» 2015-06-05 23:05:51 Możesz mi dokładnie pokazać w którym miejscu ten błąd? |
|
Monika90 |
» 2015-06-05 23:16:30 Jak przypiszesz większą macierz do mniejszej to nastąpi wyjście poza zakres tablicy. Na dodatek brakuje instrukcji return. |
|
xordi |
» 2015-06-07 00:34:57 Kolego jeśli robisz dużo obliczeń na macierzach to tylko na instrukcjach SSE. Naprawdę polecam. W bibliotekach znajdziesz DirectXMatch.h i DirectXPackedVector.h Tylko pamiętaj jeśli obiekt będzie zawierał jakąś macierz XMMATRIX musi przy tworzeniu tego obiektu cały obiekt musi zostać odpowiednio wyjustowany przez przeładowanie operatora "new" i "delete". Da się jednak to ominąć przy użyciu funkcji XMStore* z biblioteki. Reszta w dokumantacji
https://msdn.microsoft.com/en-us/library/windows/desktop/hh437833%28v=vs.85%29.aspx |
|
« 1 » |