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

Klasa z macierzą double o wymiarach 2*2. [Błąd]

Ostatnio zmodyfikowano 2015-06-07 00:34
Autor Wiadomość
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?
C/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 ); // konstruktor
    ~Macierz(); // destruktor
   
    void wypelnij_macierz();
    void wypisz_macierz();
   
    Macierz dodaj_macierz( Macierz & m2 );
    Macierz pomnoz_macierz( Macierz & m2 );
   
    Macierz & operator =( const Macierz & ); //przeladowany operator =
   
};

Macierz & Macierz::operator =( const Macierz & M ) //tu jego implementacja
{
    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() //destruktor
{
    for( int i = 0; i < m_size; i++ )
         delete tab_m[ i ]; //usuwanie elementow wiersza
   
    delete[] tab_m; //usuwanie wiersza w kolumnie
}

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 ] );
            //tab_m[i][j] = s;
        }
    }
    return suma;
   
}


int main()
{
    //Deklaracja obiektów klasy Macierz
    Macierz m1, m2, suma;
   
    // Pobranie danych do macierzy
    m1.wypelnij_macierz();
    cout << endl;
    m2.wypelnij_macierz();
    cout << endl;
   
    // Wyswietlenie podanych macierzy w celu sprawdzenia
    cout << "Podane dane: \n\n";
    m1.wypisz_macierz();
    cout << endl;
    m2.wypisz_macierz();
    cout << endl;
   
    // Dodawanie macierzy
    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;
}
P-133230
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.
P-133233
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?
P-133239
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.
P-133240
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
P-133272
« 1 »
  Strona 1 z 1