2017-01-06 2 views
1

В файле "cerberOS_BSP.h" У меня есть следующий:C: тип массив имеет неполный тип ошибку элемента для внешнего массива

extern char cmp_ids[][]; 
extern UInt8 periph_list[]; 

В файл "BSP_unpnp.c", у меня есть:

UInt8 periph_list[AMOUNT_OF_PERIPH] = {0}; 
char cmp_ids[MAX_CMPS][4] = {0}; 

Это не дает никаких ошибок для periph_list, но дает следующие за cmp_ids:

../../uJ/cerberOS_BSP.h:55:13: error: array type has incomplete element type 
extern char cmp_ids[][]; 

авторизованы, как решить эту проблему, так как я не совсем понимаю, вопрос, какие-то идеи?

+2

Возможный дубликат [GCC: тип массива имеет неполный тип элемента] (http://stackoverflow.com/questions/10003270/gcc-array-type-has-incomplete-element-type) – Tejendra

ответ

0

В случае ...

char cmp_ids[][]; 

... у вас есть два измерения с открытым (не указано) размера. Поскольку местоположение элемента вычисляется на start + index * sizeofelements, необходимо знать размер элементов.

Элемент внешней массива - это внутренний массив char[]. Размер неизвестен.

Вы можете опустить только самый внешний размер. Все остальные размеры должны быть указаны.

-1

Массив должен быть объявлен с размером, например:

extern char cmp_ids[MAX_CMPS][4]; 
extern UInt8 periph_list[AMOUNT_OF_PERIPH]; 

Для этого, в файле заголовка нужно добавить (или включить) определения MAX_CMPS и AMOUNT_OF_PERIPH. Если необходимо рассчитать время выполнения размеров можно использовать вместо указателей:

extern char **cmp_ids; 
extern UInt8 *periph_list; 
+0

Декларация может опускать размер самого внешнего измерения. Поэтому для 'periph_list' нет ошибки. –

+0

@ AminNegm-Awad Это правильно. Однако без размера первого измерения невозможно указать длину массива в клиентском модуле; sizeof не применим к неполным типам, таким как UInt8 []. –

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