代码之家  ›  专栏  ›  技术社区  ›  detly

编译时浮式包装/夯实

  •  3
  • detly  · 技术社区  · 15 年前

    我正在为pic32mx编写C,它是用microchip的pic32 c编译器编译的(基于gcc 3.4)。

    补充 我遵循的标准是GNU99(带有GNU扩展的C99,编译器标志 -std=gnu99 )

    我的问题是:我有一些可重新编程的数字数据存储在EEPROM或芯片的程序闪存中。这意味着当我想储存一个浮点数时,我必须做一些类型的punning:

    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);
    }
    

    我还将默认值作为编译时常量的数组。对于(无符号)整数值来说,这很简单,我只使用整型文字。不过,对于float,我必须使用这个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 macro 构造,但在这里没有区别。)评论很好,但是有更好的方法吗?能做这样的事情真是太好了:

    const unsigned int DEFAULTS[] =
    {
        0x00000001, // Some default integer value, 1
        COMPILE_TIME_CONVERT(0.005), // Some default float value, 0.005
    }
    

    …但我完全迷路了,我甚至不知道这样的事情是否可能。

    笔记

    1. 显然,“不,这是不可能的”是一个可以接受的答案,如果是真的。
    2. 我不太担心可移植性,所以实现定义的行为是好的,未定义的行为是不好的(我前面有IDB附录)。
    3. 正如我所知,这需要一个编译时转换,因为 DEFAULTS 在全局范围内。如果我错了,请纠正我。
    1 回复  |  直到 15 年前
        1
  •  9
  •   caf    15 年前

    你能做你的 DEFAULTS 数组 IntFloat 相反?

    如果可以, 您的编译器支持C99,然后您可以这样做:

    const IntFloat DEFAULTS[] =
    {
        { .intval = 0x00000001 }, // Some default integer value, 1
        { .floatval = 0.005 }, // Some default float value, 0.005
    };