2010-06-01 20 views
3

我正在爲使用Microchip PIC32 C編譯器(基於GCC 3.4)編譯的PIC32MX編​​寫C語言。編譯時浮動打包/打孔

新增我以下的標準是GNU99(C99用GNU擴展,編譯器標誌-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 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處於全局範圍內。如果我對此有錯,請糾正我。

回答

9

您能否讓您的DEFAULTS陣列取代IntFloat

如果可以的話,你的編譯器支持C99,那麼你可以這樣做:

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

哎呀,我忘了提,我在更新提Q.以下標準:GNU99。 – detly 2010-06-01 03:48:37

+0

@detly:然後上面應該可以正常工作 - 根本不需要python腳本.. – caf 2010-06-01 04:34:08

+0

caf是正確的,它編譯和使用gnu99,我只是試了一下。你的意思是gnu89?或者你絕對需要一系列整數? – 2010-06-01 04:54:42