2014-01-09 3 views
0

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

scanf("%d",&n); 
matrix[n][n]; 

?

Я не хочу использовать определение для второго параметра функции.

+0

Если вы покажете нам объявление функции, нам будет легко рассказать вам, как передать 2D-массив вашей функции. – haccks

ответ

0

Использование variable length array особенность C99. Затем передайте его функции в соответствии с аргументом функции с ее размером.

+0

Почему голос? – haccks

+1

Мое подозрение: еще один кандидат, который не знает, что можно передать VLA функции, и, следовательно, опускает любой (правильный) ответ, который утверждает, что это возможно ...>. < –

+0

@ H2CO3; : (((. Согласовано – haccks

1

В C 1999 реализации и в C 2011 реализации, которые поддерживают массивы переменной длины, вы можете передать массив с вводного измерения времени, объявив функцию таким образом:

ReturnType foo(size_t n, ElementType matrix[][n]) … 

В вызывающем коде, после получения n, вы можете определить матрицу с:

ElementType matrix[n][n]; 

и вы можете вызвать функцию с:

Примечания:

  • ReturnType и ElementType заполнители для типов вы выбираете. ReturnType может быть void.
  • Чтобы получить определение size_t, вам необходимо #include <stddef.h>.
  • Вы должны определить только малые массивы таким образом. Большинство реализаций C предоставляют только ограниченное пространство для массивов переменной длины с автоматическим временем хранения, и вы будете переполнять стек, если массив слишком велик.
  • Если вы используете GCC для компиляции, вы можете запросить C 1999 или C 2011 с помощью -std=c99 или -std=c11. Дополнительную информацию см. В разделе GCC documentation.

Если массив велик, вы можете определить его таким образом, вместо того, чтобы:

ElementType (*matrix)[n] = malloc(n * sizeof *matrix); 
if (!matrix) 
    Handle error. 

А потом вы должны освободить его:

free(matrix); 

Если ваша реализация C не поддерживает переменную -length, тогда вы можете выделить место для n*n элементов и проиндексировать массив вручную (элемент в строке i и столбец j будет находиться в позиции i*n+j), возможно, написав некоторые вспомогательные функции, которые помогут в индексировании. В этом случае вы передадите массив функции как простой указатель на тип элемента, а не указатель на массив элементов.

Смежные вопросы