Если размер вашей матрицы известен во время компиляции, то вы можете определить его как глобальный объект, но его размеры должны быть известны (C целочисленные константы ), где он определен.Если test.c
знает размеры, он может определить матрицу, например:
#define a 1
#define b 2
uint8_t matrix[(a+1)*b][4];
Тогда к матрице можно обратиться в main.c
, объявив (но не определив) ее там:
extern uint8_t matrix[][4];
Если main.c
также необходимо знать a
и b
, вы можете поместить эти значения в глобальные объекты, хотя вам нужно будет использовать другие имена для этих объектов, чем для макросов препроцессора, которые я показал выше,(Технически существует способ использовать одни и те же имена для обоих, но это обычно не рекомендуется.)
Если размер вашей матрицы известен во время выполнения, а не во время компиляции, то вы можете создать егоиспользуя malloc
.Например, в main.c
вы могли бы иметь:
extern uint8_t (*matrix)[4];
int main(void)
{
… Ensure the values of a and b have been set.
matrix = malloc((a+1)*b * sizeof *matrix);
if (!matrix) … Handle error
… Rest of program.
free(matrix); // (Not strictly necessary in typical multi-user systems.)
}
В любом случае я показал матрицу, видимую снаружи, потому что это то, что вы пытались сделать в своем коде.Однако, поскольку вы передаете матрицу функции в качестве параметра, скорее всего, вам не нужно, чтобы матрица была видимой снаружи, и не нужно, чтобы она определялась со статической продолжительностью хранения.В этом случае вы можете определить его в main и передать его функции:
int main(void)
{
… Ensure the values of a and b have been set.
uint8_t (*matrix)[4] = malloc((a+1)*b * sizeof *matrix);
if (!matrix) … Handle error
testFunction(matrix, z);
… Rest of program.
free(matrix); // (Not strictly necessary in typical multi-user systems.)
}
Также можно определить матрицу внутри main
:
int main(void)
{
… Ensure the values of a and b have been set.
uint8_t matrix[(a+1)*b)][4];
testFunction(matrix, z);
… Rest of program.
}
Однако,это следует использовать, только если известно, что a
и b
малы.Ресурсы, доступные для предоставления определений массива в рамках блока, как это, весьма ограничены в большинстве реализаций Си.