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

Problem z przeciązeniem operatora*, dla klasy macierz

Ostatnio zmodyfikowano 2017-01-09 18:00
Autor Wiadomość
Gabli
Temat założony przez niniejszego użytkownika
Problem z przeciązeniem operatora*, dla klasy macierz
» 2017-01-09 00:10:26
Witam. Mam problem z przeciążeniem operatora * , ktory ma u mnie mnożyć dwie macierze. Program się kompiluje, ale podczas uruchomienia wysypuje się. Nie mam pojęcia dlaczego. Moja funkcja zaprzyjażniona i konstruktory:

C/C++
Macierz operator *( const Macierz & m1, const Macierz & m2 )
{
    Macierz m3( m1.kolumny, m2.wiersze );
   
    if( m1.kolumny != m1.wiersze )
         cerr << "Blad";
    else
    {
        for( int i = 0; i < m1.wiersze; i++ )
        {
            for( int j = 0; j < m2.kolumny; j++ )
            {
                m3.tab[ i ][ j ] = 0;
                for( int k = 0; k < m2.wiersze; i++ )
                {
                    m3.tab[ i ][ j ] = m3.tab[ i ][ j ] + m1.tab[ i ][ k ] * m2.tab[ k ][ j ];
                }
            }
        }
        return m3;
    }
}

//konstuktor dwuparametrowy
Macierz::Macierz( unsigned int wier, unsigned int kol )
    : wiersze( wier )
     , kolumny( kol )
{
    tab = new float *[ wier ];
   
    for( int i = 0; i < wier; i++ )
    {
        tab[ i ] = new float[ kol ];
        for( int j = 0; j < kol; j++ )
        {
        }
    }
}

Macierz::Macierz( Macierz const & m ) //konstruktor kopiujacy
{
    wiersze = m.wiersze;
    kolumny = m.kolumny;
   
    tab = new float *[ wiersze ];
    for( int i = 0; i < wiersze; i++ )
    {
        tab[ i ] = new float[ kolumny ];
        for( int j = 0; j < kolumny; j++ )
        {
        }
    }
   
    for( int i = 0; i < wiersze; i++ )
    {
        for( int j = 0; j < kolumny; j++ )
        {
            tab[ i ][ j ] = m.tab[ i ][ j ];
        }
    }
}
To jest mój pierwszy post na forum, dlatego proszę o wyrozumiałość. Z góry dziekuję za pomoc.
P-156224
RazzorFlame
» 2017-01-09 08:24:53
C/C++
for( int i = 0; i < m1.wiersze; i++ )
{
    for( int j = 0; j < m2.kolumny; j++ )
    {
        m3.tab[ i ][ j ] = 0;
        for( int k = 0; k < m2.wiersze; i++ )
        {
            m3.tab[ i ][ j ] = m3.tab[ i ][ j ] + m1.tab[ i ][ k ] * m2.tab[ k ][ j ];
        }
    }
}
W najbardziej zagnieżdżonej pętli masz i++ a raczej chodziło Ci o k++
P-156225
darko202
» 2017-01-09 08:33:47
1.
Powinieneś zawsze opisywać zwracany błąd wykonania.
przeważnie jest tam sporo informacji na temat występującego błędu

mając tak szczątkowy kod trudno jest odtworzyć przyczynę błędu.

2.
Zapoznaj się z techniką debugowania programu, co pozwoli Ci obserwować wykonywany kod linia po linii.
P-156227
mateczek
» 2017-01-09 10:58:48
Do tego co napisał RazzorFlame dodam że powinno być raczej na odwrót
C/C++
Macierz m3( m1.kolumny, m2.wiersze );
// raczej tak jak niżej
Macierz m3( m1.wiersze, m2.kolumny );
Nowo powstała macierz ma mieć tyle wierszy ile wierszy ma macierz 1. I Tyle kolumn ile ma macierz 2

Porównaj sobie z tym poniżej. Kiedyś już był podobny wątek i coś tam klepnąłem

http://cpp0x.pl/forum/temat/​?id=23012
P-156229
Gabli
Temat założony przez niniejszego użytkownika
» 2017-01-09 18:00:27
Tak, powinno byc:
C/C++
Macierz m3( m1.wiersze, m2.kolumny );

oraz k++ w ostatniej pętli, dziękuję wszystkim za udzielone podpowiedzi.
P-156246
« 1 »
  Strona 1 z 1