det*_*tly 3 c embedded gcc type-punning
我正在为PIC32MX编写C语言,使用Microchip的PIC32 C编译器(基于GCC 3.4)编译.
添加我遵循的标准是GNU99(带有GNU扩展的C99,编译器标志-std=gnu99)
我的问题是:我有一些可重新编程的数字数据存储在EEPROM或芯片的程序闪存中.这意味着当我想存储浮动时,我必须做一些类型的惩罚:
typedef union
{
    int intval;
    float floatval;
} IntFloat;
unsigned int float_as_int(float fval)
{
    IntFloat intf;
    intf.floatval = fval;
    return intf.intval;
}
// Stores an int of data in whatever storage we're using
void StoreInt(unsigned int data, unsigned int address);
void StoreFPVal(float data, unsigned int address)
{
    StoreInt(float_as_int(data), address);
}
我还将默认值包含为编译时常量数组.对于(无符号)整数值,这是微不足道的,我只使用整数文字.但是对于浮点数,我必须使用这个Python片段将它们转换为它们的单词表示形式,以将它们包含在数组中:
import struct
hex(struct.unpack("I", struct.pack("f", float_value))[0])
...所以我的默认数组有这些难以理解的值,如:
const unsigned int DEFAULTS[] =
{
    0x00000001, // Some default integer value, 1
    0x3C83126F, // Some default float value, 0.005
}
(这些实际上采用了X宏构造的形式,但这并没有区别.)评论很好,但有更好的方法吗?能够做到这样的事情真是太好了:
const unsigned int DEFAULTS[] =
{
    0x00000001, // Some default integer value, 1
    COMPILE_TIME_CONVERT(0.005), // Some default float value, 0.005
}
......但我完全不知所措,我甚至不知道这样的事情是否可能.
笔记
DEFAULTS它在全球范围内.如果我错了,请纠正我.你可以让你的DEFAULTS数组成为一个数组IntFloat吗?
如果可以,并且您的编译器支持C99,那么您可以这样做:
const IntFloat DEFAULTS[] =
{
    { .intval = 0x00000001 }, // Some default integer value, 1
    { .floatval = 0.005 }, // Some default float value, 0.005
};