2012-01-27 4 views
1

のunsigned int型にリテラルfloatを変換するために、どのように、これがある:私のコントロール外のヘッダには同じビットパターン

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

+0

コンパイラの問題は、ユニオンの指定された初期化子がC99で導入された拡張であり、GCCのC++コードでサポートされていないことです。 C++になっていなければならないとき、私はこの質問Cに間違ったタグを付けたようです。 – Tom

+0

この回答の最初のスニペットは、未定義の動作を呼び出します。私はそれを使用することをお勧めしません。 – jpalecek

0

おそらくstatic int f(float x) { return *(int*)&x; }のような機能はありますか?

0

マイケル・カーリンの答えのような関数をコードで使用することはできません。なぜなら、関数呼び出しをイニシャライザで使用することができないからです。

しかし、このような変換を行い、結果の整数値をあなたのプログラムにコピー/ペーストするプログラムを書くことができます! (それが本当にどんな価値を持っているかという素晴らしいコメントを付けて)。

+0

魅力、コードは実際には、とにかく別のソースから生成されるため。しかし、世代はXSLTによって行われており、XSLTのビットパターンのマングリングの考えは私に悪夢を与えるのに十分です。 – Tom

0

使用されるという名前の初期化子:

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