Как передать двумерный массив в функцию c
Перейти к содержимому

Как передать двумерный массив в функцию c

  • автор:

Как правильно передать двумерный массив в функцию?

но если указать вместо size, конкретную цифру то все сработает.

void foo(int arr[][5]) < . >int arr[5][5] = <>;

Как в первом случае отправить массив в функцию ? Подскажите самый оптимальный вариант.

  • Вопрос задан более трёх лет назад
  • 9514 просмотров

Решения вопроса 3

myjcom

Roman @myjcom Куратор тега C++
const int size
Массив не передается. Передается указатель. Даже если вы пишете a[][size]
Ответ написан более трёх лет назад
Нравится 1 2 комментария

myjcom

Roman @myjcom Куратор тега C++
Размер массива должен быть известен на этапе компиляции.

myjcom

Roman @myjcom Куратор тега C++
int sum; неинициализированная переменная

#include template int foo(int (&matrix)[ColumnCount][RowCount]) < int r = 0; for(auto& row: matrix)< for(auto& x: row) r += x; >return r; > int bar()< int matrix [][2] = , , >; return foo(matrix); >

С-массивы в функции можно передавать только по ссылке. Или преобразовать в массив указателей.

Вообще, для передачи С-массивов придуман std::array , но двумерный C-массив нельзя напрямую привести к std::array, N> . Но можно изначально работать с std::array :

template int foo(std::array, ColumnCount>& matrix) < int r = 0; for(auto& row: matrix)< for(auto& x: row) r += x; >return r; > int bar()< std::array, 3> matrix = , , >>; return foo(matrix); >

Ответ написан более трёх лет назад
Нравится 1
Developer, ex-admin

Если вы изучаете С++, то лучше использовать классы стандартной библиотеки для массивов. В функцию передаете ссылку на класс.
В чистом Си передается просто указатель и размер в отдельном параметре (или 2 размера для двумерного массива).
Сам двумерный массив может быть представлен в двух вариантах:
1.Как массив указателей, где каждый указатель представляет собой одномерный массив. Нужно отдельно выделять память для массива указателей и для каждого одномерного подмассива и аналогично освобождать. В этом случае возможна операция индексации обоих измерений массива, при этом массив указателей и каждый подмассив могут находится в разных участках памяти.

void foo(int ** arr, int N, int M) < . >int main() < int N = 10; // первое измерение массива int M = 20; // второе измерение массива int ** arr = new int * [N]; for(int i = 0; i < M; ++i) < arr[i] = new int[M]; >. foo(arr, N, M); . // Тут освобождение массива аналогично выделению в обратном порядке >

2.Как одномерный массив размерностью N * M. В этом случае память под массив выделяется и освобождается вся оптом одним куском, но операция индексации первых размерностей не возможна. Но можно легко переходить от двумерного массива к одномерному, сразу вычислять нужный индекс или просто перемещаться по элементам массива с помощью временного указателя.

void foo(int * arr, size_t N, size_t M) < . >int main() < int N = 10; // первое измерение массива int M = 20; // второе измерение массива int * arr = new int * [N*M]; int * arrcur = arr; // временный указатель для обхода массива int * arrone = arr; // вариант с переходом к одномерному массиву for(int i = 0; i < N; ++i) < for(int j = 0; j < M; ++j) < // Вариант с вычислением адреса текущего элемента по индексам *(arr + i * M + j) = rand() % 10; // вычисление нужного индекса на месте // Вариант с обходом массива с помощью временного указателя *arrcur = rand() % 10; ++arrcur; // переход к следующему элементу // Вариант с переходом к одномерному массиву arrone[j] = rand() % 10; >arrone += M; > . foo(arr, N, M); . delete[] arr; >

Передача двумерного массива в функцию

Author24 — интернет-сервис помощи студентам

Начал изучать с++ в vs .
Дошел до темы функции.
Понял как передавать одномерный массив в функции.
Решил попробовать передать двумерный массив в функции. столкнулся с проблемой.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
#include ; using namespace std; void(FillArrey(int arr[][], const int row, const int col)) { for (int i = 0; i  row;i++) { for (int j = 0; j  col;j++) { arr[i][j] = rand() % 10; } } } void PrintArrey(int arr[][], const int row, const int col) { for (int i = 0; i  row;i++) { for (int j = 0; j  col;j++) { cout  [i][j]<" "; } cout  ; } } void main() { setlocale(LC_ALL, "ru"); const int ROW = 5; const int COL = 4; int arr[ROW][COL]; FillArrey(arr, ROW,COL); PrintArrey(arr, ROW,COL); system("pause"); }

Вот фрагмент где визуал кажет ошибку:
void(FillArrey(int arr[] [ ], const int row, const int col))
void PrintArrey(int arr[] [ ], const int row, const int col)
не могу понять в чем проблема, тыкался по форумам — ответов не нашел. Кто может объяснить в чем причина. Я так понял — неправильно объявляю массив в функции?

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Передача двумерного массива в функцию
вобщем все просто. void foo(int (&arr)) < >int main()< mas,,

Передача двумерного массива в функцию.
Требуется написать функцию которая бы слагала и умножала матрицы. Для этого Я завел двумерный.

Передача двумерного массива в функцию
Неожиданно для себя столкнулся с такой вот проблемой . Есть две функции : void.

Передача двумерного массива в функцию
Доброго времени суток. Как можно передать двумерный массив в функцию? Допустим есть функция: void.

Как передать двумерный статический массив в функцию на Си?

Есть массив char mass[1024][1024] и функция int fun(char*) . При вставке функции fun(mass) , компилятор выдаёт предупреждение о несоответствии типов, приходиться приводить тип fun((char*)mass)<> или fun((char*)&mass)<> . Есть ли возможность для указания статического массива как аргумента? И почему типы разные?

  • Вопрос задан более трёх лет назад
  • 3025 просмотров

Комментировать
Решения вопроса 1
Не ИТ-специалист

Целиком массив в функцию не передаётся (если только не обернуть его в структуру), а передаётся указатель на его 0-й элемент и формальный аргумент функции должен быть указателем на тип элементов массива, передаваемого фактическим аргументом.
n-мерный массив — это 1-мерный массив (n-1)-мерных массивов и, соответственно, формальным аргументом функции должен быть указатель на (n-1)-мерный массив.
В данном случае

int fun(char (*)[1024]); int fun(char (*m)[1024]) 

Ответ написан более трёх лет назад
Нравится 1 1 комментарий
Данил Тунев @lada-guy Автор вопроса
Спасибо, очень логично,в выходные заценю
Ответы на вопрос 1
«I’m here to consult you» © Dogbert

Есть массив char mass[1024][1024] и функция int fun(char*)

в такую функцию можно передать fun(&mass[0][0]) .

Есть ли возможность для указания статического массива как аргумента?

В смысле массива статической размерности? Легко: int fun(char a[][1000]); . fun(mass);
Ответ написан более трёх лет назад
Данил Тунев @lada-guy Автор вопроса

Компилятор gcc не разрешает такого рода аргументы: int fun(char mass[][1000]); Только с помощью указателей передаются массивы. В общем разобрался, спасибо за ответ!

Компилятор gcc не разрешает такого рода аргументы: int fun(char mass[][1000])

О, как интересно. Данил Тунев расскажи мне, почему, а то я даже отдалённо не вижу никаких проблем?
Ваш ответ на вопрос

Войдите, чтобы написать ответ

c

  • C
  • +1 ещё

Как запрограммировать кнопку на изменение алгоритма для atmega128 на C?

  • 1 подписчик
  • 13 февр.
  • 74 просмотра

14 Лекция. Передача двумерного массива в качестве параметра функции (продолжение). Двумерные массивы в куче (обобщение).

Передача двумерного массива в качестве параметра функции (продолжение).

В предыдущих примерах основной недостаток — наличие глобальных переменных.

Избавиться от них можно если передавать в параметры функции не массив а только указатель.

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

Пример: Передача двумерного массива в качестве параметра функции (в двух файлах).

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#include #include #include "sum_array.h" int main ()  static int n=2, m=3; int sum_a; int array[n_g][m_g] = 1,4,5,3>,4,5,6,7>>; sum_a = sum_array(array,n,m); sum_a = sum_array(array,n_g,m_g); srand((unsigned)time(NULL)); for (int i=0; in; i++)  for (int j=0; jm; j++)  array[i][j]=1+rand()%8; > > sum_a = sum_array(array,n,m); sum_a = sum_array(array,n_g,m_g); > 

Пример: Файл (sum_array.h) с функцией «sum_array».

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
const int n_g =3; const int m_g =4; int sum_array (int array[][m_g], int n, int m)  int sum =0; for (int i=0; in; i++)  for (int j=0; jm; j++)  sum = sum + array[i][j]; std::cout  [i][j]  <" "; > std::cout  <"\n"; > std::cout  <"Сумма элементов массива sum color: #000080;">  <"\n"; return sum; >

Если убрать количество элементов в строке m_g, произойдет ошибка компиляции.

Т.к. строка является элементов одномерного массива, а размер элемента массива должен быть известен.

  1. замена многомерного массива одномерным и имитация внутри функции доступа к двумерному массиву,
  2. использование одномерного массива указателей на одномерные массивы (строки).

Пример: Передача двумерного массива в качестве параметра функции (в двух файлах).

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#include #include #include "sum_array.h" int main ()  const int n=3, m=4; int sum_a; int array[n][m] = 1,4,5,3>,4,5,6,7>>; int *p[n]; for (int i=0; in; i++)  p[i] = array[i]; > sum_a = sum_array(p,n,m); srand((unsigned)time(NULL)); for (int i=0; in; i++)  for (int j=0; jm; j++)  array[i][j]=1+rand()%8; > > sum_a = sum_array(p,n,m); > 

Пример: Файл (sum_array.h) с функцией «sum_array».

1 2 3 4 5 6 7 8 9 10 11 12 13
int sum_array (int **mas, int n, int m)  int sum =0; for (int i=0; in; i++)  for (int j=0; jm; j++)  sum = sum + mas[i][j]; std::cout  [i][j]  <" "; > std::cout  <"\n"; > std::cout  <"Сумма элементов массива sum color: #000080;">  <"\n"; return sum; >

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

Двумерные массивы в куче (обобщение)

Создадим стандартные функции для работы с массивами в куче:

mem_new — выделение памяти в куче для массива
mem_del — освобождение памяти в куче для массива
add_array — заполнение массива
out_array — вывод массива

Пример: Файл (mem_new.h) с функцией «mem_new».

1 2 3 4 5 6 7 8 9
//Функция выделения памяти в куче для двухмерного массива void mem_new (int **&p, int n)  p = new int *[n]; for (int i=0; in; i++)  p[i] = new int [n]; > >

Пример: Файл (mem_del.h) с функцией «mem_del».

1 2 3 4 5 6 7 8 9
// Функция освобождения памяти void mem_del(int **p, int n)  for (int i=0;in; i++) delete [] p[i]; > delete [] p; >

Пример: Файл (add_array.h) с функцией «add_array».

1 2 3 4 5 6 7 8 9 10
// Функция заполнения массива случайными числами void add_array(int **p, int n)  srand((unsigned)time(NULL)); for (int i=0; in; i++)  for (int j=0; jn; j++)  p[i][j] = 1 + rand()%9; > > >

Пример: Файл (out_ar)(color: #0000ff;(color: #800080;ray.h) с функцией «out_array».

1 2 3 4 5 6 7 8 9 10 11
//Функция вывода матрицы на консоль void out_array(int **p, int n)  for (int i=0; in; i++)  for (int j=0; jn; j++)  std::cout [i][j] <" "; > std::cout  <"\n"; > >

Пример: Файл (main.cpp) с функцией «main».

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#include #include #include #include "mem_new.h" #include "mem_del.h" #include "add_array.h" #include "out_array.h" int main ()  int n; std::cout  <"Введите размер матрици color: #008080;">; std::cin >> n; int **p; mem_new(p,n); add_array(p,n); out_array(p,n); mem_del(p,n); >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *