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

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

  • автор:

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

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

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

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

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

Решения вопроса 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; >

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

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

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

Комментировать
Решения вопроса 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])

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

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

cpp

  • C++
  • +1 ещё

В чем ошибка кода?

  • 1 подписчик
  • 7 часов назад
  • 97 просмотров

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

Передать статический двумерный массив в функцию так, чтобы можно было получать доступ к его элементам через синтаксис a[x][y] можно только используя технику динамических массивов.

Однако есть более простой способ доступа к данным массива путем передачи указателя на первый элемент двумерного массива. При этом двумерный массив внутри функции будет выглядеть как одномерный массив указателей на одномерные массивы, и доступ к элементам нужно осуществлять с помощью конструкции [y*размерность_x+x].

Вот первый пример, как можно передавать двумерный массив:

void fun(int **array, int sizey, int sizex)

value=p_array[ y * sizex + x ]; // [ x ][ y ]

fun((int**)table, 5, 4);

Как видно, синтаксис неудобен, и внутри функции fun() для доступа к элементам используется создание дополнительного указателя.

Есть более простой вариант для передачи двумерных массивов, размер которых заранее известен:

#define TABLE_SIZE_X 5

#define TABLE_SIZE_Y 4

Передача динамического массива в функцию выполняется другими методами.

  • Стандарт языка программирования Си
  • Передача параметра в функцию по указателю в C стиле
  • Передача параметров в функцию по указателю (C стиль) и по ссылке (C++ стиль)
  • Передача структуры в функцию и изменение значений элементов структуры
  • В чем разница объявления строки как массива и как указателя
  • Использование очень больших чисел
  • getch() в Linux
  • Аргументы функции main()
  • Как побайтно считать файл
  • Реализация циклического сдвига ROR и ROL
  • Динамическая загрузка библиотек в Linux
  • Функция fmemopen() — открытие набора байт как файла в памяти с получением файлового дескриптора
  • Подмена дефайнов (#define)
  • Успешной отладки, шутка
  • Как описывать функции с аргументами по-умолчанию в C/C++
  • Форматированный вывод через функцию printf
  • Создание и удаления двухмерного и трехмерного динамического массива
  • Как передать в функцию двумерный массив, размер которого известен
  • Как передать в функцию динамический двумерный массив
  • Как правильно читать объявления в Си
  • Вычисление pbkdf2 на языке C
  • Определение разрядности платформы 32 или 64 бит
  • Функции getuid() и geteuid()
  • Указатели и символьные строки в языке C
  • Практическое применение LD_PRELOAD или замещение функций в Linux
  • Проблемы C-подобных языков. Где находиться типу: справа или слева? (Теория)
  • Откуда в языке Си появился синтаксис указателей, и для чего он предназначался изначально
  • Как в языке Си вызвать функцию, для которой известен адрес вызова в виде числа
  • Вызов функции по известному адресу в языке Си — абстрактный тип данных указателя на функцию
  • Структуры в языке Си. Определения структур в сравнении с языком C++
  • Структуры в языке Си. Указатели на структуры
  • Структуры в языке Си. Массивы структур
  • Операция запятая «,» в языке Си и Си++
  • Самый быстрый и оптимальный способ копирования строк в Cи и C++

Передать 2D-массив в качестве параметра функции в C++

В этом посте мы обсудим, как передать двумерный массив в качестве параметра функции на языке программирования C++.

1. Статический массив

Если нам известны размеры массива во время компиляции, мы можем передать массив по ссылке, используя шаблон функции в C++, как показано ниже:

#define M 5
#define N 5
// создаем шаблон функции
void assign ( int ( &arr ) [ r ] [ c ] )
for ( size _ т i = 0 ; i < r ; i ++ ) for ( size _ т j = 0 ; j < c ; j ++ ) < arr [ i ] [ j ] = i + j ; // Программа для передачи 2D-массива в качестве параметра функции на C++ int arr [ M ] [ N ] ; assign ( arr ) ; // печать двумерного массива

Преимущество использования этого подхода заключается в том, что нет необходимости указывать размеры массива. Недостатком использования этого подхода является то, что мы не можем использовать его с динамическими массивами.

Мы также можем создать оболочку над функцией, как показано ниже, что более эффективно для больших массивов:

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

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