Не в состоянии понять это определение функции - PullRequest
0 голосов
/ 26 ноября 2011

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

void matmul(float (*A)[N],int BlockX, int BlockY)

Ответы [ 2 ]

4 голосов
/ 26 ноября 2011

Первый аргумент - указатель на массив из N элементов:

float a[N];
matmul(&a, 2, 3);

(Обратите внимание, что N должна быть константой времени компиляции в C89 и C ++; в C89 это будетпо существу, должно быть #define d как некоторое буквальное значение. В C99 у вас есть массивы переменной длины.)

Поскольку массивы распадаются на указатели, вы также можете передать ему массив:

float b[M][N];
matmul(b, 2, 3);
1 голос
/ 26 ноября 2011

Другим способом написания того же прототипа будет

void matmul(float A[][N],int BlockX, int BlockY)

, который лучше показывает, что обычно предполагается получить, двумерный массив, для которого N равен

  • целочисленная константа времени компиляции (не const переменная!), если у вас есть только C89
  • любое целочисленное выражение, которое может быть оценено в точке определения , если у вас современный C99

Другое измерение не указано, и вы должны каким-то образом знать или передавать его.

Мне кажется, что этот интерфейс старый, так как кажется, что он использует int параметры для передачи информации о размере.Современный способ сделать это (и избежать 32/64-битных проблем и тому подобного) состоит в использовании size_t для таких величин.

Если случайно два параметра будут соответствовать «реальной» матрицеизмерение, в современном C ваше определение должно выглядеть так:

void matmul(size_t m, size_t n, float A[m][n]) {
   ...
}

, где важно, чтобы m и n предшествовали A, так что они уже известны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...