Другие языки программирования и технологии

Как можно передать ДВУМЕРНЫЙ массив в функцию в С++, не создавая его, как глобальный. Пример ниже:

#include
#include
using namespace std;

const int ROWS = 5;
const int COLS = 5;
int arr[ROWS][COLS];// глобальный двумерный массив

// прототипы
void fill_array_rand(int arr[ROWS][COLS], const int ROWS, const int COLS);
int min_in_array(int arr[ROWS][COLS], const int ROWS, const int COLS);
int max_in_array(int arr[ROWS][COLS], const int ROWS, const int COLS);

void main()
{
setlocale(LC_ALL, "ru");
srand(time(NULL));

// заполняем массив
fill_array_rand(arr, ROWS, COLS);
// ...
cout<<endl<<"Минимальное значение: "<<min_in_array(arr, ROWS, COLS)<<endl;
cout<<endl<<"Максимальное значение: "<< max_in_array(arr, ROWS, COLS) << endl;
}

// функция для заполнения массивая рандомными числами
void fill_array_rand(int arr[ROWS][COLS], const int ROWS, const int COLS)
{
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = rand() % 30 + 30;
cout << arr[i][j] << " ";
}
cout << endl;
}
}

// ищем минимальное число в массиве
int min_in_array(int arr[ROWS][COLS], const int ROWS, const int COLS)
{
int now_min_value = arr[0][0];
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
if (arr[i][j] < now_min_value)
{
now_min_value = arr[i][j];
}
}
}
return now_min_value;
}

// ищем максимальное число в массиве
int max_in_array(int arr[ROWS][COLS], const int ROWS, const int COLS)
{
int now_max_value = arr[0][0];
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
if (arr[i][j] > now_max_value)
{
now_max_value = arr[i][j];
}
}
}
return now_max_value;
}
все переменные которые идут в функцию должны создаться на стеке, а обычно двумерный массив огромной длины, так вы предлагаете время тратить на создание такого массива и переписывание в нем значений и после обработки функцией заниматься переписыванием еще раз? Прочитайте тему про двумерные массивы и передавайте указатель на этот массив.
Иван Крыжановский
Иван Крыжановский
52 514
Лучший ответ
Евгений Малышев Хм, видимо рано за такие задачки взялся)
Я только-только начал изучать плюсы, еще не дошел до указателей и стека.
Знаю только, что массивы передаются по ссылке, а не по значению, как примитивные типы.
Спасибо за ответ!
Сережа Балханцев Если массив нужен только в функции, вполне нормально создавать его на стеке. Конечно, если он не очень большой (чтоб не было переполнения стека).
Проще использовать структуру или класс.
Это абстракция, и в машинном коде ничего лишнего не будет.

например нужна матрица 4 на 4 (такие матрицы используются например в 3D программах, для трансформаций объекта, анимации и т. д.)

//низкоуровневый способ
float m[4][4];

передача в функцию
void f( float * m )

но это если мы знаем размер.

если не знаем то передаём ещё и размер

void f( float * m, unsigned int size )
....

но лучше делать так.
двумерный массив означает что есть какой-то СПИСОК ОБЪЕКТОВ
та же матрица
[1][0][0][0]
[0][1][0][0]
[0][0][1][0]
[0][0][0][1]

каждая строка - объект, содержащий 4 значения.
struct vec4{
float x,y,z,w;
};

struct matrix4x4{
vec4[4];
};

matrix4x4 m; //вот он двумерный массив

void f( matrix4x4 & m ){
....
}

----------------------

список строки аналогично
struct string{
char buf[ 100 ];
};

struct list{
string strings[ 1000 ]; // список с 1000 строками
};

void f( list & L ) //передали только адрес
Надо полагать самый простой и очевидный способ
https://ideone.com/fSK5gy