Неправильный вывод суммы матриц С++

182
14 ноября 2018, 10:40

Начал повторять C++ и возникла проблема при суммировании матриц, что вывод 2-х матриц А и В нормальный, а при выводе матрицы А+В выходит вот что :

(матрица 2х2, для других также)

а11+в11 -842150451
а21+в21 -842150451

Тоесть первые столбцы суммирует нормально,а остальные нет Почему так?

#include "stdafx.h"
#include <iostream>
#include <stdlib.h> 
using namespace std;

void MatrCreate(int**Arr2d, int n, int m)
{
    for (int i = 0; i<n; i++)
    {
        for (int j = 0; j<m; j++)
        {
            Arr2d[i][j] = rand() % 10;
        }
    }
}
void MatrOut(int**Arr2d, int n, int m)
{
    for (int i = 0; i<n; i++)
    {
        for (int j = 0; j<m; j++)
        {
            cout << Arr2d[i][j] << " ";
        }
        cout << endl;
    }
}
void MatrSum(int**A1, int**B1,int**Sumarr, int n, int m)
{
        for (int i = 0; i<n; i++)
        {
            for (int j = 0; i<m; i++)
            {
                Sumarr[i][j] = A1[i][j] + B1[i][j];
            }
        }
        for (int i = 0; i<n; i++)
        {
            for (int j = 0; j<m; j++)
            {
                cout << Sumarr[i][j] << " ";
            }
            cout << endl;
        }
}
int main()
{
    int n;
    int m;
    cout << " please input n:" << endl;
    cin >> n;
    cout << " please input m: " << endl;
    cin >> m;
    int **Arr = new int*[n];
    for (int i = 0; i < m; i++)
    {
        Arr[i] = new int[n];
    }
    MatrCreate(Arr, n, m);
    MatrOut(Arr, n, m);
    int **Barr = new int*[n];
    for (int i = 0; i < m; i++)
    {
        Barr[i] = new int[n];
    }
    cout << "____________________" << endl;
    MatrCreate(Barr, n, m);
    MatrOut(Barr, n, m);
    cout << "____________________" << endl;
    cout << " Sum of Matrices:" << endl;
    int **Sumarr = new int*[n];
        for (int i = 0; i < m; i++)
        {
            Sumarr[i] = new int[n];
        }
        MatrSum(Arr, Barr,Sumarr, n, m);
        delete []Arr; 
        delete []Barr;
        delete []Sumarr;
    system("pause");
    return 0;
}
Answer 1
  1. Вы как будто собираетесь работать с матрицами n x m, но выделение памяти везде делаете с размером n, при этом почему то выполняя цикл только до m

    int **Arr = new int*[n];
    for (int i = 0; i < m; i++)
    {
        Arr[i] = new int[n];
    }
    

    То есть фактически вы выделяете память для матрицы m x n. А далее доступаетесь к ней, как к n x m. Получается вылет за пределы массива со типичными последствиями.

    Почему цикл только до m? Почему всегда выделяется массив размера n?

  2. Циклы при суммировании матриц

       for (int i = 0; i<n; i++)
        {
            for (int j = 0; i<m; i++)
    

    Почему в обоих циклах сравнение и инкремент делается для i?

  3. Бессмыслицей также является

    delete Arr, Barr, Sumarr;
    

    Что вы пытаетесь этим сделать?

READ ALSO
C++ неявное приведение типов

C++ неявное приведение типов

подскажите пожалуйста, как в компилятор С++ разрешает проблему неявного привидения типовВ частности интересует вопрос: почему в первом случае...

292
Что из себя представляет null?

Что из себя представляет null?

Нет такого типа, которому бы соответствовал instanceof от null

144