Почему в первом ряду появляется какое-то другое значение, кроме нуля? - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь создать MxN нулевую матрицу, используя массив в C++. Но некоторые значения не приближаются к нулю. Пожалуйста, помогите мне решить эту проблему.

#include <iostream>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
int i,j,s[m][n]={0};
for(i=0;i<m;i++)
{
    for(j=0;j<n;j++)
    {
        cout<<s[i][j]<<" ";
    }
    cout<<endl;
}
}

ввод: 4 4

вывод:

0 11097 1757549776 11097 
0 0 0 0 
0 0 0 0 
0 0 0 0 

ожидаемый выход:

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

Ответы [ 6 ]

1 голос
/ 08 октября 2019

Этот код недопустим в стандартном C ++, потому что он не позволяет создавать динамические массивы без new, как это.

Например, вот вывод VC ++: https://rextester.com/VFVL26633

ource_file.cpp(9): note: failure was caused by non-constant arguments or reference to a non-constant symbol
source_file.cpp(9): note: see usage of 'm'
source_file.cpp(14): warning C4552: '<<': operator has no effect; expected operator with side-effect
source_file.cpp(18): error C2036: 'int [m][n]': unknown size

Если вы сделаете n, m const, он будет работать правильно.

Использовать std::vector или new / delete.

0 голосов
/ 08 октября 2019

Используйте пустую скобку {} для инициализации массива. Это по умолчанию инициализирует все элементы массива в null.

0 голосов
/ 08 октября 2019

Когда вы объявляете массив s, его размеры должны быть известны во время компиляции. Поскольку вы не инициализировали явно m и n, они оба инициализируются с некоторыми случайными значениями и используются для объявления массива s. Таким образом, ваш массив s может иметь любые случайные размеры (возможно, ноль), и после ввода m и n из cin вы можете просто напечатать некоторые неинициализированные ячейки памяти.

0 голосов
/ 08 октября 2019

Назначение размера статической матрицы / массива в виде переменной запрещено. Вы должны указать размер во время компиляции или использовать динамические массивы.

#include <iostream>
using namespace std;
int main()
{
    int i, j, s[4][4] = { 0 };
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            cout << s[i][j] << " ";
        }
        cout << endl;
    }
}
0 голосов
/ 08 октября 2019

s[m][n]={0} инициализация действительна только тогда, когда вы знаете размер матрицы во время компиляции, вам нужно использовать memset или цикл для инициализации этой матрицы. использовать memset очень просто: memset(s,0,m*m*sizeof(int))

0 голосов
/ 08 октября 2019

Я не уверен, но, вероятно, это потому, что размер матрицы является динамическим, и компилятор не может генерировать инициализатор во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...