C到Pascal类型转换

boj*_*vic 0 c freepascal arduino raspberry-pi

美好的一天,

我在Master(Raspberry pi 2B,使用Lazarus)和Slave - Arduino Nano之间进行I2C通信.在Arduino我定义了

 typedef union
 {
   float Temperature;
   uint8_t bytes[4];
 } floatuint;
 floatuint fu;
Run Code Online (Sandbox Code Playgroud)

我已经定义了覆盆子pi

 TFloatUint = packed record
   case Boolean of
     False: (dabDouble: Double);
     True: (dabByte: packed array[0..3] of cuint8);
 end;
Run Code Online (Sandbox Code Playgroud)

使用命令

 count := FpRead(I2DeviceHandle, fl.dabByte, 4);
Run Code Online (Sandbox Code Playgroud)

我收到字节数组的相同值,但fl.dabDouble显示不同的结果.

例如:

 fu.Temperature = 19.19;
 fu.bytes = (0, 128, 153, 65);

 fl.dabByte = (0, 128, 153, 65);
 fl.dabDouble = 2.6656892163191751e-314
Run Code Online (Sandbox Code Playgroud)

我犯了哪个错误?

LU *_* RD 7

Doublepascal中的大小为8个字节.使用Single4个字节.

TFloatUint = packed record
   case Boolean of
     False: (dabSingle: Single);
     True: (dabByte: packed array[0..3] of cuint8);
 end;
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 5

C float是4字节单精度浮点类型.Pascal Double是8字节双精度.换句话说,你使用了错误的类型.它应该是:

TFloatUint = record
   case Boolean of
     False: (Temperature: Single);
     True: (bytes: array[0..3] of cuint8);
 end;
Run Code Online (Sandbox Code Playgroud)

另请注意,您不应打包记录.并不是说它对布局有任何影响,但会导致类型具有错误的对齐值.我认为没有理由打包阵列.

由于我不知道的原因,世界各地的Pascal程序员似乎倾向于想要打包不应该打包的东西.