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 程序员似乎都倾向于打包不应该打包的东西。
美好的一天,
我从事主控(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 程序员似乎都倾向于打包不应该打包的东西。