2016-03-23 11 views
0

Ich stieß auf zwei Lösungen zum Lesen der Float-Wert eines BLE-Sensors. Die Memcpy-Methode ist einfach und macht Sinn, aber die andere Methode, auf die ich gestoßen bin, ist für mich nicht klar. Kann jemand genau erklären, wie die Zeiger-Casting-Methode funktioniert?Memcpy vs Pointer Cast zum Lesen BLE Sensor Float

// Represents data read from BLE device. Float value of 1.5 
    uint32_t data = 0x3fc00000; 
    float sensorValue; 

    // Memcpy method, makes sense and is straightforward 
    memcpy(&sensorValue, &data, sizeof(sensorValue)); 

    // Works, but don't fully understand exactly how 
    sensorValue = *(float *)&data; 
+0

Beide rufen undefiniertes Verhalten auf. – Olaf

+0

@Olaf Pflege um zu erarbeiten? Was wäre der richtige Weg, um den Float-Wert zu erhalten? –

+0

http://port70.net/~nsz/c/c11/n1570.html#6.5p6. Um genau zu sein, können Sie Funktionen der Standardbibliothek und normale Operatoren verwenden. Sie können auch die Math-Bibliothek überprüfen, wenn Neuinterpretationsfunktionen vorhanden sind. Ich bin mir bewusst, dass dies ein Dilemma ist. Aber beachten Sie, dass Sie nicht einmal angeben, ob das Float-Format auf Ihrer Plattform und vom Sensor identisch ist. Ganz zu schweigen von Ausrichtung und Endlichkeit. – Olaf

Antwort

2

& Daten ist ein Zeiger auf eine uint32_t. Also, (float *) & Daten wirft es als Zeiger auf einen Float. Schließlich, * (float *) & Daten dereferenziert diesen Zeiger.

Sie könnten das gleiche tun wie:

uint32_t *ui32 = &data 
float *f = (float *) ui32; 
sensorValue = *f; 

Aber ist das genaue Verhalten wahrscheinlich Plattform abhängig sein.

+0

Nein, das Verhalten ist nicht definiert. Verletzung der effektiven Typregel – Olaf