時間フロートパッキング/パンニングをコンパイルします
-
05-10-2019 - |
質問
MicrochipのPIC32 Cコンパイラ(GCC 3.4に基づく)でコンパイルされたPIC32MXのCを書いています。
追加した 私がフォローしている標準はGNU99(GNU拡張機能、コンパイラフラグ付きのC99です -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マクロ 構成要素ですが、それはここでは違いはありません。)コメントは素晴らしいですが、より良い方法はありますか?次のようなことができるのは素晴らしいことです。
const unsigned int DEFAULTS[] =
{
0x00000001, // Some default integer value, 1
COMPILE_TIME_CONVERT(0.005), // Some default float value, 0.005
}
...しかし、私は完全に途方に暮れており、そのようなことが可能かどうかさえわかりません。
ノート
- 明らかに「いいえ、それは不可能」は、真実なら許容可能な答えです。
- 私は移植性についてあまり心配していないので、実装の定義された動作は問題ありません。未定義の動作は問題ありません(私の前にIDB付録があります)。
- 私が知っているように、私が知っているように、これはコンパイル時間変換である必要があります。
DEFAULTS
グローバルな範囲にあります。私がこれについて間違っているなら、私を修正してください。
解決
あなたはあなたを作ってくれませんか DEFAULTS
配列の配列 IntFloat
代わりは?
できれば、 と コンパイラはC99をサポートしていますが、これを行うことができます。
const IntFloat DEFAULTS[] =
{
{ .intval = 0x00000001 }, // Some default integer value, 1
{ .floatval = 0.005 }, // Some default float value, 0.005
};
所属していません StackOverflow