2010-08-13 2 views
1

Пожалуйста, простите меня, если это глупый вопрос, я довольно новичок в C и не смог найти пример этого онлайн, поэтому я предполагаю, что я не могу сделать то, что Я хочу. но, надеюсь, кто-то здесь может указать мне в правильном направлении.Определение значения структуры в ее объявлении в файле заголовка

поэтому у меня headerfile, объявляющий на структуру как так

typedef struct{ 

    float *float_array1; 

    float *float_array2; 

    int anInt; 

    int anotherInt; 

}IMAStruct; 

IMAStruct aStruct; 

Я хотел anInt всегда быть инициализированы в 0, когда структура объявлена, то мем для поплавка массивов получает выделено на основе ли это 1 или 0;

Проблема заключается в том, что я работаю над массивным проектом, и этот код используется в прослушивателе действий, и я действительно не могу изменить любую другую часть кода. Я только хочу, чтобы он запускал код один раз, а затем пропустил его. Это казалось хорошим способом сделать это.

ответ

1

Это не та вещь, которую вы должны делать в заголовке.

Проблема в том, что объявление структуры не выполняет никакого кода. Вызов malloc или создание условной ветви требует выполнения кода.

Теперь, вы можете сделать это случиться так или иначе в НКУ, объявив функцию, как это:

void initAStruct __attribute__((init)) { 
    aStruct.anInt = 0; 
    aStruct.float_array2 = (float*)malloc(sizeof(float)*10); 
} 

В C99, я думаю, что это может быть сделано с float float_array2[anInt*10];, но вы не можете сделать это в C89.

0

Я не уверен, что вы хотите, но поскольку это C, а не C++, вам нужно написать функцию для инициализации ваших структур так, как вы хотите. В C нет способа указать, что каждый экземпляр структуры начинается с определенной инициализации. Вы можете определить константный инициализатор (как макрос) и потребовать, чтобы все пользователи структуры инициализировали его с этим, но он не будет работать, когда вам потребуется динамическое распределение.

+0

Ну, мне нужно, чтобы 2 массива с плавающей точкой были распределены динамически. но инты просто установлены .. Я мог бы вытащить int из структуры, с которой было бы легче справиться. –

+0

Я думаю, я мог бы просто проверить, были ли инициализированы массивы ... но я не могу понять, как это сделать, любые мысли? –

+0

Если вы ноль инициализируете новые экземпляры структуры (hint: static/global переменные всегда инициализируются нулем), вы можете просто проверить, не указаны ли указатели массива NULL. –

0

Если структура определена в области видимости файла, то есть вне любой функции (или в функции, если она равна static,), то она всегда инициализируется таким же образом: целые числа и поля с плавающей запятой инициализируются на 0 и поля указателя инициализируются до NULL (это применяется рекурсивно к вложенным структурам и объединениям).

Если структура определена в функции («в стеке» или выделена «в куче» с помощью malloc), поля не инициализируются автоматически, и они начинаются с того, что любые случайные мусора оказались в этих бит памяти заранее.

Нет никакого переносного способа указания кода инициализации программы; если вам нужно что-то запускать, когда запускается ваша программа, вы должны поместить ее в main. Однако некоторые платформы предоставляют для этого не переносные расширения.

0

Просто инициализировать его везде независимо от того, в файле или области видимости функции, как это:

IMAStruct aStruct = { 0 }; 

Это гарантирует, что все поля инициализируются 0 или NULL для указателей. Тогда вы можете легко определить, не изменилась ли переменная и инициировать инициализацию.

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

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