Problem z przeładowaniem operatora*

Problem z przeładowaniem operatora*
  • Rejestracja: dni
  • Ostatnio: dni
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ę :)

Kopiuj
 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];
		}
	}
}
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Co mówi debugger?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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:

Kopiuj
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ą?

SC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
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?

Kopiuj
  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ć:

Kopiuj
 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ć

  • Rejestracja: dni
  • Ostatnio: dni
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.