Problem z przeładowaniem operatora*

0

Witam. Mam problem z przeładowaniem operatora * do operacji mnożenia 2 macierzy. Program kompiluje się bez błędów, ale podczas uruchomienia się wysypuje.
Nie mam pojęcia dlaczego. W klasie mam zdefiniowany konstruktor 2- parametrowy, który rezerwuje pamieć i konstruktor kopiujacy. Przeciążenie operatora: dodawania, odejmowanie i mnożenia dla operacji mnożenia przez skalar działa u mnie bez zarzutu, a tutaj VS sie wysypuje. Jakby ktoś mógł pomóc byłbym wdzięczny. Z góry dziekuję :)

 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];
		}
	}
}
1

Co mówi debugger?

0

ale podczas uruchomienia się wysypuje

Nie ma takiego objawu jak wysypuje się. Stawiasz breakpointy w kodzie, uruchamiasz debugger a potem klikasz krok po kroku przez kod aż nie zobaczysz najpierw co, a potem dlaczego się wysypało. Z kuli ci tego nikt nie wywróży. No i to:

if (m1.kolumny != m1.wiersze)

nie ma za bardzo sensu, w związku z czym jesteś w ogole pewien że wymiary tych macierzy do siebie pasują?

1

To może ja spróbuję powróżyć z fusów skoro z kuli się nie da ;)

Trzecia pętla... czy to wychodzi w ogóle z tej pętli?

  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;
    }
}

powinno chyba być:

 for (int k = 0; k < m2.wiersze; k++)

Może to jest to bo chyba wychodzisz poza zakres... Nie wiem dokładnie dawno nie pisałem w CPP XD mogę się mylić

0

Tak, faktycznie. Nie wiem jak mogłem nie tego zauważyć, jakaś zaćma. Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1