2016-10-19 4 views
0

大きなメッセージがあり、デフォルト値に初期化する必要があります。メッセージは、サブ構造、列挙型などの多くの構造体です。メッセージのフィールドごとのパーズを含むメッセージの自動生成された記述ファイルがあります。フィールド開始バイト、開始ビット、長さ、タイプ、デフォルト値。 私はメッセージをビットバッファとして扱い、記述ファイルに従ってそれを初期化する仕組みを実装しました。しかし、私は浮動小数点のデフォルトに問題があります。 浮動小数点変数のビット単位の自動設定を行うにはどうすればよいですか?C++:ビット単位で浮動小数点変数に値を設定

ありがとうございます!

+0

それが依存、何をすべき浮動のデフォルト値ポイントメンバーは?ゼロの場合、ゼロはすべて正常です。 –

+0

しかし、もしあなたがC++でプログラミングしているのであれば、それ自身のメンバを適切に初期化する構造体ごとにデフォルトのコンストラクタを持つことができないのですか?非仮想メンバ関数(コンストラクタなど)は、構造体のデータを「汚染」しません。 –

+0

デフォルト値は遅れる可能性があります。記述ファイルは、第三者から私に渡されます。 – rainbringer

答えて

0

私は自分で解決することができました。 次のことを想定します

MSG_STRUCT_TYPE OutputMsg; // e.g.750 bytes 
int startByte = 28; // the start byte of floating point field in the message 
float defVal = -1.75f; // the default value for the field above 

、我々は次のような操作を行うことができますreinterpret_castはを使用して:

unsigned char* bytes_to_set = reinterpret_cast<unsigned char*>(&defVal); 
unsigned char* msgBuff = reinterpret_cast<unsigned char*>(&OutputMsg); 
*reinterpret_cast<float*>(&msgBuf[startByte]) = *reinterpret_cast<float*>(bytes_to_set); 

仕事をすること。


実装し、njuffaのコメント怒鳴るを確認した後、私は答え別(simplierとクリーナー)としてそれを追加している:

unsigned char* msgBuff = reinterpret_cast<unsigned char*>(&OutputMsg); 
memcpy(&msgBuf[startByte], &defVal, sizeof(float); 
+0

現代の最適化コンパイラでは、単純に 'memcpy()'は、型が異なるデータ間のデータ転送に影響を与える、最も鮮明で畳み込まれていない効率的な方法です。私はそれを試してみることをお勧めします。 – njuffa

+0

時々、私たちの心は、単純な方法を無視し、複雑なパスを検索します...))私は間違いなく働くためにそれを試みます。ありがとう。 – rainbringer

関連する問題