У меня есть несколько причин для определения типа для массива фиксированной длины, например:
typedef float fixed_array_t[NX][NY];
Затем я хочу передать ссылки на fixed_array_t
экземпляры другим функциям.Я получаю предупреждение компилятора как от GCC, так и от CLANG, хотя вижу правильное поведение.
Что говорит мне это предупреждение компилятора и как должен быть изменен мой код, чтобы избежать предупреждения?Бонус, почему я должен #define
размер массива?Константы времени компиляции, очевидно, не работают.error: variably modified ‘fixed_array_t’ at file scope
Вот небольшой демонстрационный код:
#include <stdio.h>
#define NX 2 // also, why does const int NX = 2; not work?
#define NY 3
typedef float fixed_array_t[NX][NY];
void array_printer( const fixed_array_t arr )
{
int i, j;
for (i = 0; i < NX; i++ )
for( j=0; j < NY; j++ )
printf("Element [%d,%d]=%f\n", i,j, arr[i][j] );
}
int main( int argc, char ** argv )
{
fixed_array_t testArray = { {1,2,3}, {4,5,6} };
array_printer( testArray );
}
Предупреждение GCC:
warning: passing argument 1 of ‘array_printer’ from incompatible pointer type
Предупреждение CLANG (фактически компилируется эквивалентный код в OpenCL):
warning: incompatible pointer types passing 'fixed_array_t' (aka 'real [2][3]'), expected 'real const (*)[3]'
Тем не менее, программа работает нормально:
Element [0,0]=1.000000
Element [0,1]=2.000000
Element [0,2]=3.000000
Element [1,0]=4.000000
Element [1,1]=5.000000
Element [1,2]=6.000000