C++/cpp mnożenie dla tablic 2x2 i 1x1 działa, dla 3x3 już nie. W którym miejscu jest błąd/ czego muszę dokładniej się nauczyć ?

0
#include <iostream>
#include <cstdlib>
using namespace std;

void wyswietl (int** t, const unsigned n)
{
    for (unsigned i = 0; i < n; i++)
    {
        cout << endl;
        for (unsigned j = 0; j < n; j++)
        {
            cout << t[i][j] << '\t';
        }
    }
    cout << endl;
}
void wypelnij (int** t, const unsigned n)
{
    int cyfra = 0;
    for (unsigned i = 0; i < n; i++)
    {
        cout << "Podaj cyfre dla " << i+1 <<" wiersza: " << '\t';
        cin >> cyfra;
        for (unsigned j = 0; j < n; j++)
        {
            t[i][j] = cyfra;
        }
    }
}
void pamiec_del (int** t, const unsigned n)
{
    for (unsigned i = 0; i < n; i++)
    {
        delete [] t[i];
    }
}
void utworz_pamiec (int** t, const unsigned n)
{
    //t =  new int* [n];
    for (unsigned i = 0; i < n; i++)
    {
        t[i] = new int [n];
    }
}
void zerowanie (int** tab, const unsigned n)
{
    for (unsigned i = 0; i < n; i++)
    {
        for ( unsigned j = 0; j < n; j++)
        {
            tab[i][j] = 0;
        }
    }
}
void mnozenie (int** A, int** B, const unsigned n, int** tab_wynik)
{
    for (int i =0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            for (int k = 0; k < n; k++)
            {
                tab_wynik[i][j] = (A[i][k] * B[k][j]) + tab_wynik[i][j];
            }
        }
    }

}
int main()
{
    unsigned n = 0;
    cout << "Podaj rozmiar tablicy: " << endl;
    cin >> n;
    int** tab1 = new int * [n];
    int** tab2 = new int * [n];
    int** tab_wynik = new int * [n];
    utworz_pamiec(tab_wynik, n);
    utworz_pamiec (tab1, n);
    cout << "Wypelnianie pierwszej macierzy: " << endl;
    wypelnij(tab1, n);
    wyswietl (tab1, n);
    cout << "Wypelnianie drugiej macierzy: " << endl;
    wypelnij(tab2, n);
    wyswietl (tab2, n);
    zerowanie (tab_wynik, n);
    cout << "Test wyzerowanej macierzy wynikowej: " << endl;
    wyswietl (tab_wynik, n);
    mnozenie (tab1, tab2, n, tab_wynik);
    cout << "Macierz wynikowa mnozenia: " << endl;
    wyswietl (tab_wynik, n);
    pamiec_del(tab1, n);
    pamiec_del(tab2, n);
    pamiec_del(tab_wynik, n);
    cout << endl;
    tab1 = nullptr;
    tab2 = nullptr;
    tab_wynik = nullptr;

    return 0;
}


3

Jak "nie dziala"?

0

83 linia, program w tym miejscu nie przechodzi na 84, tylko wyrzuca returna.

5

Nigdzie nie wywołujesz utworz_pamiec dla drugiej tablicy. Ale przede wszystkim nie rób tego co robisz, to nieczytelne, błędogenne i zła praktyka.

https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

0

właśnie pisałem, że przerabiając kod tyle razy dla różnych wariantów umknęło mi, że nie użyłem dla jednej tablicy tej funkcji ;p Dzięki za pomoc :)

4

jeśli chodzi o zwalnianie pamięci, to tak nam podali na studiach, na razie robię tak jak wymagają bo jestem totalnym początkującym. Domyślam się, że rozszerzą nam potem o elementy które podrzuciłeś, jak nie to sam będę szukać tego. — PaawllooPL dziś, 19:47

Myślałem, ze szkoła średnia. Jaka to uczelnia?

Fikcją jest, ze jest to kod w C++. To jest C ze strumieniami.
Zabetonowanie nieznajomości języka C++, a szkoda, bo ma nawet w podstawowym zakresie, wiele środków aby to robić bezpieczniej.

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