При выводе числа из массива выводится числа которые там отсутствуют

Рейтинг: 0Ответов: 1Опубликовано: 27.04.2023

У меня есть код перемножения матриц (Закоменченые cout-строки выводят структуру выходной матрицы):

#include <iostream>

using namespace std;

long **matrix_mult(int **matrix_a, int **matrix_b, int *size_a, int *size_b){
    if(size_a[0]==size_b[1]){
        long **out_matrix = new long*[size_a[0]];
        
        for(long layer=0;layer<size_a[0];layer++){
            for(long clmn=0;clmn<size_b[1];clmn++){
                
                out_matrix[layer] = new long[size_b[1]];

                long elem_n=0;
                for(long elem=0;elem<size_a[1];elem++){
                    //cout<<matrix_a[layer][elem]<<"*"<<matrix_b[elem][clmn]<<" | ";
                    elem_n+=matrix_a[layer][elem]*matrix_b[elem][clmn];
                }
                out_matrix[layer][clmn]=elem_n;
                //cout<<" elem: "<<out_matrix[layer][clmn]<<" --- "; <- Тут выводится то, что нужно
            }
            cout<<endl;
        }

        cout<<"OK\n";
        return out_matrix;
    } else {
        cout<<"INVALID MATRIX FORMAT\n";
    }
    cout<<"FAIL\n";
}

int main(){
    cout<<"\nSTART\n";
    int **a = new int*[2];
    a[0] = new int[3]{1,2,2};
    a[1] = new int[3]{3,1,1};

    int **b = new int*[3];
    b[0] = new int[2]{4,2};
    b[1] = new int[2]{3,1};
    b[2] = new int[2]{1,5};

    int sa[]{2,3};
    int sb[]{3,2};

    /*
    Нужный результат:
    12 14
    16 12
    */

    cout<<matrix_mult(a, b, sa, sb)[0][0]; // Тут выводится что то вроде "1900736", а должно 12
    cout<<"\nEND\n";
}

При попытке запустить код ошибок нет, от переполнения я попытался избавиться заменив int на long(так как уже встречался с похожей проблемой из-за переполнения), но это не помогло, всё рушится на моменте завершения всех for-ов. Как можно исправить это?

ОС: Windows 10

Компилятор: g++ mingw32 7.3.0

PS: При замене int на long оказалось, что число, которое выводится в консоль будет на столько большим, на сколько можно(но не максимум числового типа), я поменял long на long long и вывелось число еще более большое

Ответы

▲ 0Принят

Строку out_matrix[layer] = new long[size_b[1]]; надо вынести перед внутренним циклом.

Плюсом надо поменять индексы в 1-ом if-е: size_a[1]==size_b[0]

Спасибо @StanislavVolodarskiy