2016-03-23 15 views
0

Bir BLE sensörünün kayan değerini okumak için iki çözümle karşılaştım. Memcpy yöntemi basittir ve mantıklıdır, ancak karşılaştığım diğer yöntem bana çok açık değildir. Birisi işaretçi döküm yönteminin nasıl çalıştığını tam olarak açıklayabilir mi?memcpy vs okuma için işaretçi döküm BLE sensörü yüzer

// 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

Her ikisi de tanımlanmamış davranışları çağırır. – Olaf

+0

@Olaf özenle tasarlanıyor? Şamandıra değerini almak için doğru yol ne olurdu? –

+0

http://port70.net/~nsz/c/c11/n1570.html#6.5p6. Kesinlikle uygun olmak için standart kütüphane ve normal operatörlerin işlevlerini kullanabilirsiniz. Yeniden yorumlama işlevleri varsa matematik kütüphanesini de kontrol edebilirsiniz. Bunun bir ikilem olduğunun farkındayım. Ancak, float formatının platformunuzda ve sensörden aynı olup olmadığını belirtmezsiniz. Uyum ve endianess söz değil. – Olaf

cevap

2

& veri uint32_t bir işaretçidir. Yani, (float *) & veri bir float için bir işaretçi olarak atıyor. Son olarak, * (float *) & veri dereferences işaretçi.

Sen aynı şeyi yapabilirdi:

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

Ama kesin davranış platformu bağımlı olması muhtemeldir.

+0

Hayır, davranış tanımsız. Etkin tip kural ihlali. – Olaf