2016-10-19 8 views
0

Ich habe eine große Nachricht, die auf Standardwerte initialisiert werden muss. Die Nachricht ist eine Struktur mit vielen Unterstrukturen, Enums, etc. Ich habe eine automatisch generierte Beschreibungsdatei der Nachricht, die das Feld-für-Feld-Parse der Nachricht enthält: field start byte, start bit, length, type, Standardwert. Ich habe einen Mechanismus implementiert, der die Nachricht als Bitpuffer behandelt und entsprechend der Beschreibungsdatei initialisiert. Aber .... Ich habe ein Problem mit Fließkommavorgaben. Wie mache ich die Automatisierung der Bitmap-Variablen variabel setzen?C++: Wert auf Fließkomma-Variable durch Bits setzen

Danke!

+0

Es hängt davon ab, was sollte der Standardwert des schwebenden Punkt Mitglieder sein? Wenn es Null ist, dann sind alle Null gut. –

+0

Aber dann, wenn Sie in C++ programmieren, warum können Sie nicht für jede Struktur einen Standardkonstruktor haben, der alle seine eigenen Mitglieder in der richtigen Weise initialisiert? Nicht-virtuelle Member-Funktionen (wie Konstruktoren) "verschmutzen" nicht die Daten einer Struktur. –

+0

Die Standardwerte können verschoben werden, sie sind nicht voraus bekannt. Die Beschreibungsdatei wird mir von Dritten zur Verfügung gestellt. – rainbringer

Antwort

0

Nun, ich habe es geschafft, es selbst zu lösen. gelten folgende Voraussetzungen:

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 

nun mit der reinterpret_cast wir folgende Manipulation tun können:

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); 

, dass die Arbeit zu tun.


Nach der Implementierung und njuffa ‚s Kommentar unten Überprüfung Ich füge es als ein anderes (simplier und Reiniger) Antwort:

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

Mit modernen optimierenden Compilern ist ein einfaches 'memcpy()' oft die klarste, unkonvertierte und effiziente Methode, um solche Datenübertragungen zwischen unterschiedlich typisierten Daten zu beeinflussen. Ich würde vorschlagen, es zu versuchen. – njuffa

+0

Manchmal vernachlässigt unser Verstand die einfachen Wege und sucht nach komplexen Pfaden ...)) Ich werde es auf jeden Fall versuchen, wenn ich wieder arbeite. Vielen Dank. – rainbringer