2015-08-01 3 views
0

Я начинающий программист в C. У меня есть структура, которая имеет разные типы данных, такие как int, float, bool. Я пытаюсь инициализировать эту структуру до значения 0.0 во время инициализации, а также во время выполнения встроенного приложения. Я выполняю член по инициализации члена. Я не могу использовать функцию memset(), поскольку он увеличивает указатель на 2 байта. Мне интересно, есть ли эффективный способ сделать эту инициализацию.Инициализация структуры в C

Ex:

typedef struct _ABC_ 
{ 
     float a; 
     float b; 
     float c; 
     int x; 
     bool_t y; 
}ABC; 
+5

вы пытались 'ABC ABC = {0};'? – mch

+6

Что вы подразумеваете под 'it приращение указателя на 2 байта'? [memset()] (http://www.cplusplus.com/reference/cstring/memset/) ничего не увеличивает. –

ответ

6

Я не могу использовать memset() функцию, как это увеличивает значение указателя на 2 байта.

Да, вы можете использовать memset() - это не «приращение» ничего:

ABC abc; 
memset(&abc, 0, sizeof(ABC)); //Sets sizeof(ABC) bytes to 0 

Единственная проблема с этим подходом является то, что установка всех бит чисел с плавающей запятой, не означает, что их стоимость будет равна 0. в частности, в качестве IEEE 754 состояний:

-0 и +0 являются отличные значения, хотя оба они сравниваются как равные.

Так на самом деле, их внутреннее представление потребности быть различными (и, таким образом, ни один из них может иметь все биты, установленные в 0). В случае IEEE 754это просто случайно, что обнуленное значение равно 0. Другие представления FP могут (и, вероятно, будут) отличаться в этом вопросе.

Из-за этого, вы можете инициализировать эту структуру как каждый POD-тип:

ABC abc = 
{ 
    0.0f, //a 
    0.0f, //b 
    0.0f, //c 
    0, //x 
    false //y 
}; 

Или еще лучше:

ABC abc = 
{ 
    0 //initializes all members to 0 
}; 

Последний пример работает только, если все члены этой структуры может быть инициализирован значением интегрального типа (что верно в данном конкретном случае).

+1

'memset (..., 0, ...)' просто очистит все биты. Это не обязательно означает, что ничего, кроме целых, будет установлено в их нулевое значение (0,0 или нулевой указатель). Для Float 0.0 со всеми обнуленными битами, для IEEE754, истинно, но стандарт не требуется; особенно на встроенных системах, они могут использовать другой формат. Для указателя стандарту требуется только нулевой указатель, чтобы не иметь действительного значения указателя; он не требует «всех бит нуля». Вы должны указать, что, по крайней мере, для правильного ответа. – Olaf

+0

@ Олаф Да, действительно. Готово. –

+1

FYI: «это просто случайно, что нулевое значение равно 0». Это не случайно, но умный дизайн. В прежние времена единицы с плавающей запятой были редкими, поэтому поплавки приходилось часто рассчитывать в программном обеспечении. делая +0.0 равным целому числу 0, разрешено использовать один и тот же тест и быстро очистить память (да, 'memset'). Моя точка зрения фактически не является форматом IEEE754. Стандарт позволяет это. И вы даже не указали указатели. – Olaf

-4

Стандарты ISO c и ISO C++ говорят, что установка всех битов нуля не гарантирует, что значение с плавающей запятой будет равно нулю. Вы должны явно присвоить ей 0.0.

Также нет точной точки с плавающей точкой.Есть пять различных числовых диапазонов, что числа с плавающей точкой одинарной точности не в состоянии представить:

  • Отрицательные числа меньше, чем - (2-2e-23) × 2e127 (отрицательное переполнение)
  • Отрицательные числа больше чем -2Й-149 (отрицательный) сгущенный
  • Ноль
  • положительных числа менее ого-149 (положительная сгущенного)
  • положительных чисел больше, чем (2-2e-23) × 2e127 (положительное переполнение)

Предложение:

#define INFINITESIMAL 2e-149 

ABC abc = 
{ 
    INFINITESIMAL, 
    INFINITESIMAL, 
    INFINITESIMAL, 
    0, 
    false, // You may preserve the comma at the end of the list in ISO C99 
}; 
+1

Ссылка, необходимая для * Нет точной точки с плавающей точкой. * –

+1

Это абсолютно неправильно. В контексте инициализации значение будет неявно преобразовано по мере необходимости. См. [This] (http://stackoverflow.com/questions/5199338/what-is-the-significance-of-0-0f-when-initializing-in-c) и [this] (http: // stackoverflow. com/questions/1384434/c-difference-between-0-and-0-0). –

+0

http://steve.hollasch.net/cgindex/coding/ieeefloat.html#zero –

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