Intereting Posts
не удалось настроить AC-компилятор Невозможно объединить выходную переменную strtok. strcat и strtok Перемещение каталогов рекурсивно с помощью функции FindFirstFileEx Как проверить, является ли файл текстовым (ASCII) или двоичным в C Как я могу получить время выполнения программы в миллисекундах в C? Если перечисление никогда не будет использоваться в API? Найдите сумму цифр в 100 факториале в C без использования массива Петля над 256 значениями с использованием 8-разрядной целочисленной переменной без знака в качестве счетчика как проверить статические функции C с помощью google test Как отключить оптимизацию компилятора gcc для включения переполнения буфера выполнение команд через сокеты с помощью popen () Внедрение конвейерной обработки в c. Какой был бы лучший способ сделать это? (Собственная shell linux) передача целочисленных аргументов при использовании execve Сканирование и петли Строить модуль Python (2.7) на GCC 4.8 не удается

Инициализация статического массива в C

Рассмотрим следующие утверждения

typedef struct { int member1; int member2; }Custom_t; void ISR(void) { static Custom_t struct1[SOME_CONSTANT]; ...... ...... } 

Как я могу инициализировать всю переменную member2 до одного значения в программировании на языке C?

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

Другое решение – предоставить структуре глобальную область для текущего файла. Но единственной функцией, которая использует эту структуру, является ISR ().

 void ISR(void) { static Custom_t struct1[SOME_CONSTANT] = { {0, 3}, {0, 3}, ...... ...... }; ...... ...... } 

Есть ли способ решить эту проблему в C?

Как насчет добавления жестко запрограммированного времени компиляции с SOME_CONSTANT в .c файле (например, прямо перед инициализатором)?

 #if SOME_CONSTANT !=  #error "SOME_CONSTANT is not equal to " #endif 

Рациональность этого «жесткого кода» возникает, когда SOME_CONSTANT , необходимо обновить инициализатор, а также проверку времени компиляции.

Вам не нужно заранее указывать размер массива, вы можете вычислить его позже:


 static Custom_t struct1[] = { {0, 3}, {0, 3}, {13,3}, }; #define SOME_CONSTANT (sizeof struct1 /sizeof struct1[0]) 

или: используйте __LINE__ для вычисления количества элементов.

Я должен был сделать что-то подобное с проектами с настраиваемым количеством датчиков:

[Custom_t.h]

 typedef struct { int member1; int member2; }Custom_t; #define MAX_CUSTOM_T 4 Custom_t *new_Custom_t (int member1, int member2); 

[Custom_t.c]

 #include "custom_t.h" static Custom_t g_Customt[MAX_CUSTOM_T]; static uint8 g_numCustom_t = 0; Custom_t *new_Custom_t (int member1, int member2) { if ( g_numCustom_t < MAX_CUSTOM_T ) { Custom_t *new_obj = &g_Customt[g_numCustom_t++]; new_obj->member1 = member1; new_obj->member1 = member2; return new_obj; } else { // throw exception? // or go into while(1)? // or software breakpoint if debug? // or just... return NULL; } } 

[Main.c]

 #include "custom_t.h" Custom_t *myCustom1; Custom_t *myCustom2; Custom_t *myCustom3; somefunc() { myCustom1 = new_Custom_t (0,3); myCustom2 = new_Custom_t (1,3); myCustom3 = new_Custom_t (2,3); // do stuff } 

Это означает, что если вы хотите создать новую, вам может понадобиться или не нужно обновлять MAX_CUSTOM_T в зависимости от ее размера уже, но просто нужно будет добавить новый вызов строки new_Custom_t (int, int). Недостаток, хотя он немного сложный для того, что вам может понадобиться, и если вы когда-либо захотите добавить больше членов для инициализации, вам нужно будет обновить параметры, переданные в новую функцию, чтобы соответствовать. Это можно сделать вместо отправки отдельной структуры для параметров, а не нескольких параметров (немного как гармония MPLAB).

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

 #include  #define SOME_CONSTANT 30 typedef struct { int member1; int member2; } Custom_t; int main(void) { static Custom_t struct1[SOME_CONSTANT] = { [0 ... SOME_CONSTANT - 1].member2 = 30 }; printf("%d\n", struct1[25].member2); printf("%d\n", struct1[19].member2); printf("%d\n", struct1[0].member2); return 0; }