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
}
...但我茫然很完全,我甚至不知道如果這樣的事情是可能的。
注意
- 顯然 「不,這是不可能的」,是一個可以接受的答案,如果真。
- 我並不過分擔心可移植性,所以實現定義的行爲是好的,未定義的行爲不是(我有IDB附錄坐在我面前)。
- 正如我所知道的那樣,這需要編譯時間轉換,因爲
DEFAULTS
處於全局範圍內。如果我對此有錯,請糾正我。
哎呀,我忘了提,我在更新提Q.以下標準:GNU99。 – detly 2010-06-01 03:48:37
@detly:然後上面應該可以正常工作 - 根本不需要python腳本.. – caf 2010-06-01 04:34:08
caf是正確的,它編譯和使用gnu99,我只是試了一下。你的意思是gnu89?或者你絕對需要一系列整數? – 2010-06-01 04:54:42