2012-01-27 14 views
1

的unsigned int類型在頭我的控制之外,還有這個:如何字面的浮動轉換爲相同的位模式

typedef union { 
    char * v_charp; 
    int v_int; 
    float v_float; 
} value_t; 

typedef struct var { 
    char *name; 
    value_t value; 
} variable; 

#define VARIABLE_DEF(Name, Value) {Name, {(char*)Value}} 

他們預計,在我的代碼,我會做這樣的事情:

variable my_variables[2] = { 
    VARIABLE_DEF("Variable 1", 1), 
    VARIABLE_DEF("Variable 2", 2) 
}; 

誰寫這顯然沒有考慮,你可能想用一個浮點文字初始化工會。所以我需要弄清楚如何將文字浮點數轉換爲相同位模式的整數。如果我可以使用中間變量,那麼它很容易:

float tmp; 

variable my_variables[2] = { 
    VARIABLE_DEF("Variable 1", tmp = 1.1f, *((unsigned int *)(&tmp))), 
    VARIABLE_DEF("Variable 2", tmp = 2.2f, *((unsigned int *)(&tmp))) 
}; 

但是你不能在結構初始化程序中使用變量。我還可以做些什麼?

回答

2

如何

variable my_variables[2] = { 
    VARIABLE_DEF("Variable 1", ((value_t){.v_float = 1.1f}.v_int)), 
    VARIABLE_DEF("Variable 2", ((value_t){.v_float = 2.2f}.v_int)), 
}; 

(未經測試)

關於第二個想法,怎麼樣在需要時定義更靈活的選擇VARIABLE_DEF和使用?

喜歡的東西

#define VARIABLE_DEF_ALT(Name, Value) {Name, {Value}} 
#define VARIABLE_DEF_ALT2(Name, Field, Value) {Name, {.Field = Value}} 

variable my_variables[2] = { 
    VARIABLE_DEF_ALT("Variable 1", .v_float = 1.1f), 
    VARIABLE_DEF_ALT2("Variable 2", v_float, 2.2f), 
}; 

應該工作。

或者只是跳過宏:

variable my_variables[2] = { 
    {"Variable 1", {.v_float = 1.1f}}, 
    {"Variable 2", {.v_float = 2.2f}}, 
}; 

- 是實際宏,或者是你簡化這個討論一個更復雜的情況下?

+0

我看到了這個的第一部分,並且認爲'很棒,當然就是這樣!不過,編譯器還有其他想法。實際情況更復雜 - 仍然有一個枚舉,結構和宏定義如圖所示,但每個枚舉的成員更多。這個宏真的是增值。 – Tom 2012-01-30 10:34:28

+0

編譯器的問題是指定的聯合初始化程序是C99中引入的擴展程序,GCC不支持C++代碼。看來我錯誤地標記了這個問題C,當它應該是C++的 - 我沒有意識到它造成了這種差異。 – Tom 2012-01-30 10:46:30

+0

此答案中的第一個片段將調用未定義的行爲。我不會建議使用它。 – jpalecek 2012-01-30 11:03:23

0

也許像static int f(float x) { return *(int*)&x; }這樣的功能會做?

0

您不能在代碼中使用Michael Kerlin的答案中的函數,因爲函數調用不能用於初始值設定項中。

但是,您可以編寫一個程序來完成這樣的轉換,然後將生成的整數值複製/粘貼到您的程序中! (有一個很好的評論說它真的有什麼價值)。

+0

有吸引力的,因爲代碼實際上是從另一個源產生的反正。然而,這一代是由XSLT完成的,而在XSLT中對位圖模式進行修改的想法足以讓我做出惡夢...... – Tom 2012-01-30 10:47:43

0

使用命名初始化:

variable my_variables[2] = { 
    VARIABLE_DEF("Variable 1", 1), 
    { .name = "Variable 2", .value.v_float = 1.1f } 
}; 
相關問題