Как вывести сумму строк в 2D массиве Переполнение стека

РЕДАКТИРОВАТЬ: я довольно плохо знаком с C ++. Начал работать с этим языком две недели назад.

Извините, если раньше об этом спрашивали, но я искал повсюду в Интернете, как суммировать отдельные строки в двумерном массиве, и не нашел ответа, который искал.

Мне нужно отобразить сумму каждой отдельной строки в [m] [n], но по какой-то причине это работает только тогда, когда мой массив 2×2, но если он 3×3 или больше, то я получаю следующий вывод в терминале:

for intsance, a[3][3]=
{1,2,3},   //this is determined by the user
{1,2,3},
{1,2,3};

then i get the following output:
9179942 //address of some sort???
6       // actual sum. code is working here (yay :D)
469090925// again something i dont understand

Это то, что я имею до сих пор

#include <iostream>
using namespace std;
int main(){
int m,n;
cout<<"Enter number of rows for array"<<endl;
cin>>m;
if (m>10){
cout<<"More than 10 rows will be too big"<<endl;
return 1;
}
cout<<"Enter number of collumns for array"<<endl;
cin>>n;
if (n>10){
cout<<"More than 10 collumns will be too big"<<endl;
return 1;
}
int a[m][n];
for(int i=0; i<m;i++){
cout<<"Enter "<<m<<" values into row "<<i+1<<endl;
for(int j=0; j<n; j++){
cout<<"a ["<<i<<"]["<<j<<"]: ";
cin>>a[i][j];
}
}
cout<<"Array dimensions: "<<m<<"x"<<n<<'\n'<<"resulting array: "<<endl;
for(int i=0; i<m;i++){
for(int j=0; j<n; j++){
cout<<a[i][j]<<"    ";
}
cout<<endl;
}
int avg[m];
int el_less_avg;
for(int i=0; i<m; i++){
for(int j=0; j<n;j++){
avg[i]+=a[i][j];
}
}cout<<"\n\n";
for(int i=0; i<m; i++){

cout<<avg[i]<<endl;
}

return 0;
}

0

Решение

int avg[m];
int el_less_avg;
for(int i=0; i<m; i++){
for(int j=0; j<n;j++){

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

int avg[m];
for (int i = 0; i < m; ++i) {
avg[i] = 0;
for (int j = 0; j < n; ++j) {
avg[i] += a[i][j];
}
}
1

Другие решения

int a[m][n]; не допускается в стандарте C ++. Размеры массивов в стиле C должны быть известны во время компиляции. Программа, использующая этот код, может делать буквально все что угодно.

Вы можете заменить эту строку на:

vector<vector<int>> a(m, vector<int>(n));

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

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

for(int x : avg)
cout << x << endl;

что уменьшает вероятность ошибки при использовании неправильной буквы в условии цикла.

1

По вопросам рекламы [email protected]