float to DWORD
-
float ist 4 byte groß
DWORD ist 4 byte großwie speichere ich einen float wert in einer DWORD Variable, ohne dass die Nachkommastellen gelöscht werden und man später per casting oder ähnlichem den ursprünglichen float wert erhält?
-
schon gut - selber drauf gekommen - memcpy()
-
Azrael, il Meraz schrieb:
memcpy()
geht auch ohne:
float f; DWORD d; ... d = *(DWORD*)&f;
-
d = reinterpret_cast<DWORD> (f);
-
#include <windows.h> #include <iostream> using namespace std; struct GSpace { DWORD space[8]; }; GSpace GlobalSpace; void writeGS(void*,short); float GetGSfloat(short); bool FunktionDieKeineParameterHabenDarf(); int main() { float x = 20.0; writeGS(&x, 0); while(x>0) { FunktionDieKeineParameterHabenDarf(); x=GetGSfloat(0); cout << "Leben:" << x << "\n"; } printf("\n"); return 0; } bool FunktionDieKeineParameterHabenDarf() { float x; x = GetGSint(0); x = x - 2.9; writeGS(&x, 0); return true; } void writeGS(void* Val,short Index) { memcpy(&(GlobalSpace.space[Index]), Val, (size_t) sizeof(DWORD)); } float GetGSfloat(short Index) { float pfVal; memcpy(&pfVal, &(GlobalSpace.space[Index]), (size_t) sizeof(float)); return pfVal; }
x verändert sich nicht, was ist passiert?
-
1. Warum verwendest du memcpy? Das ist völlig überdimensioniert für dein Problem.
2. Warum speicherst du den Wert nicht als float, wenn du ihn nur als float liest und schreibst und nur einmal ein int verwendest, das du per reinterpret_cast erhalten kannst?
3. Warum printf UND cout?!
-
-
Das ist nur eine vereinfachte Version des eigentlichen Programms, im richtigen Programm werden auch Strukturen in den GlobalSpace kopiert u.ä. natürlich dann auch mit Größenangabe.
nur einmal ein int verwendest
Hier hab ich mein Fehler entdeckt - ich hab aus Versehen die Funktion GetGSint verwendet, die so aussieht;
int GetGSint(short Index) { int piVal; memcpy(&piVal, &(GlobalSpace.space[Index]), (size_t) sizeof(int)); return piVal; }
kein Wunder, dass das Programm gespinnt hat
3)hab ursprünglich nur printf verwendet, da sah auch der sonstige QC etwas anders aus und das Programm hat sich auch normal benommen, es wurden aber nur nullen angezeigt, dewegen dachte ich, es liegt an printf() und hab kurzerhand using namespace std; und cout reingehauen
achso:
reinterpret_cast<DWORD> (x)
gibt nen fehler:
'reinterpret_cast': 'float' kann nicht in 'DWORD' konvertiert werden Diese Konvertierung ist eine gültige Standardkonvertierung, die implizit oder mit dem static_cast-Operator oder mit einer Typumwandlung im C- oder Funktionsformat durchgeführt wird
-
-
reinterpret_cast klappt anscheinend nicht, wenn du eine reguläre Konvertierung zur Verfügung hast (und diese reguläre Konvertierung würd in deinem Fall die Nachkommastellen kappen). Die Lösung dazu wäre es, über Zeiger zu gehen:
d = *reinterpret_cast<DWORD*>(&f);
PS: Aber wozu brauchst du das? Wenn du einen float-Wert als Ganzzahl reinterpretierst, bekommst du idR nichts wirklich nutzbringendes heraus.