Delphi 记录类型中的绝对寻址字段

Delphi 记录类型中的绝对寻址字段,delphi,record,discriminated-union,Delphi,Record,Discriminated Union,我试图与一个嵌入式系统接口,该系统以相当简单的格式传输和接收数据,但有严格的大小要求 在C语言中,您可以使用联合类型来公开一些变量数据,这些变量数据可能具有位于内存中同一位置的不同类型。将此联合类型的变量添加到结构中,然后可以使用各种名称和类型仔细引用该结构字段: 为简单起见,请忽略字节对齐和打包 typedef枚举{F1_V1,F1_V2,F1_V3}标志1_T; typedef枚举{F2_V1,F2_V1}标志_2_T; typedef联合 { 标志1_T标志1; FLAG_2_T FLAG

我试图与一个嵌入式系统接口,该系统以相当简单的格式传输和接收数据,但有严格的大小要求

在C语言中,您可以使用联合类型来公开一些变量数据,这些变量数据可能具有位于内存中同一位置的不同类型。将此联合类型的变量添加到结构中,然后可以使用各种名称和类型仔细引用该结构字段:

为简单起见,请忽略字节对齐和打包

typedef枚举{F1_V1,F1_V2,F1_V3}标志1_T; typedef枚举{F2_V1,F2_V1}标志_2_T; typedef联合 { 标志1_T标志1; FLAG_2_T FLAG_2; } 国旗; 类型定义结构 { 字节标识; INT32_T值; 国旗;; } 数据项; 现在我可以将flag字段解释为flag_1_T或flag_2_T

我想在Delphi2010中使用同样的方法。我试图通过对记录字段使用绝对寻址来实现这一点:

类型 标志_1_T=F1_V1、F1_V2、F1_V3; 标志_2_T=F1_V1,F1_V2; 类型 数据项=记录 id:字节T; 值:INT32_T; 标志1:标志1; 标志2:标志2不是绝对标志1; 终止 但这无法编译,语法错误为E2029';'应为,但找到标识符“绝对”

如果我将这些标志声明置于记录类型定义之外,但与记录类型定义的作用域相同,那么它可以很好地编译:

请注意,这对于我试图完成的任务是无用的

类型 标志_1_T=F1_V1、F1_V2、F1_V3; 标志_2_T=F1_V1,F1_V2; 类型 数据项=记录 id:字节T; 值:INT32_T; 终止 变量 标志1:标志1; 标志2:标志2不是绝对标志1;
那么为什么我不能在记录内这样做呢?有没有其他方法可以实现这一点?

您可以使用以下记录类型将C联合转换为Delphi:


记录中的boolean..东西不需要额外的空间吗?我的意思是,FLAG_T的大小是否与FLAG_1_T和FLAG_2_T中最大的一个完全相同?只有在使用字段标记声明它时,才会保留额外的空间,如案例B:Boolean of。。。链接文档中也解释了这一点:标签(如果有)作为一个额外字段使用。。。如果没有标签,是的,FLAG_T将与FLAG_1_T和FLAG_2_T中最大的一个大小完全相同。@ardnew它确实解决了您的问题。您可以创建一个单独的类型来表示并集,并将其包含在外部记录中;并集:0:d:Double的记录大小写整数;1:s:单身;终止b:布尔型;终止但是你需要原谅格式问题,因为注释中的格式太乱了!!!将其粘贴到Delphi中并按CTRL+D!FWIW为我转换为变量记录的每个联合中的实例定义了新的枚举类型。这样看起来更清楚
type
  FLAG_T = record
    case Boolean of
      False: (flag_1: FLAG_1_T);
      True: (flag_2: FLAG_2_T);
  end;