Вам нужно следующее:
#include <iostream>
const size_t N = 4;
int * sum( const int a[][N], size_t n )
{
int *result = new int[n];
for ( size_t i = 0; i < n; i++ )
{
result[i] = 0;
for ( const int &item : a[i] ) result[i] += item;
}
return result;
}
int main()
{
int data[][N] =
{
{ 1, 2, 3, 4 },
{ 9, 2, 4, 6 },
{ 4, 2, 6, 8 }
};
const size_t M = sizeof( data ) / sizeof( *data );
auto result = sum( data, M );
for ( size_t i = 0; i < M; i++ ) std::cout << i << ": " << result[i] << '\n';
delete [] result;
return 0;
}
Выход программы:
0: 10
1: 21
2: 20
То есть в функции sum
вам нужно динамически выделить массив с номером элементов, равных количеству строк в двумерном массиве, переданных функции в качестве аргумента.
Не забудьте освободить его, когда он больше не нужен.
Вы можете написать более обобщенную c функцию, которая способна обрабатывать двумерные массивы различных размеров. Например,
#include <iostream>
template <size_t M, size_t N>
int * sum( const int ( &a )[M][N] )
{
int *result = new int[M];
for ( size_t i = 0; i < M; i++ )
{
result[i] = 0;
for ( const int &item : a[i] ) result[i] += item;
}
return result;
}
int main()
{
const size_t N = 4;
int data[][N] =
{
{ 1, 2, 3, 4 },
{ 9, 2, 4, 6 },
{ 4, 2, 6, 8 }
};
const size_t M = sizeof( data ) / sizeof( *data );
auto result = sum( data );
for ( size_t i = 0; i < M; i++ ) std::cout << i << ": " << result[i] << '\n';
delete [] result;
return 0;
}
Вывод программы будет таким же, как показано выше.
0: 10
1: 21
2: 20
Также было бы лучше определить тип возвращаемого значения как long long int.
long long int * sum( const int a[][N], size_t n )
{
long long int *result = new long long int[n];
for ( size_t i = 0; i < n; i++ )
{
result[i] = 0;
for ( const int &item : a[i] ) result[i] += item;
}
return result;
}
В этом случае риск переполнения рассчитанных сумм можно минимизировать.