C 到 Pascal 类型转换

C to Pascal type conversion

美好的一天,

我从事主控(Raspberry pi 2B,使用 Lazarus)和从属 - Arduino Nano 之间的 I2C 通信。 在 Arduino 上我定义了

 typedef union
 {
   float Temperature;
   uint8_t bytes[4];
 } floatuint;
 floatuint fu;

在Raspberry pi我已经定义

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

使用命令

 count := FpRead(I2DeviceHandle, fl.dabByte, 4);

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

例如:

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

 fl.dabByte = (0, 128, 153, 65);
 fl.dabDouble = 2.6656892163191751e-314

我哪里弄错了?

Double 在 Pascal 中的大小为 8 个字节。使用 Single 这是 4 个字节。

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

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

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

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

出于我不知道的原因,世界各地的 Pascal 程序员似乎都倾向于打包不应该打包的东西。