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

Absolute addressing fields in a record type

我正在尝试与一个嵌入式系统交互,该系统以相当简单的格式传输和接收数据,但对大小有严格的要求。

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

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

typedef enum { F1_V1, F1_V2, F1_V3 } FLAG_1_T;
typedef enum { F2_V1, F2_V1        } FLAG_2_T;

typedef union
{
  FLAG_1_T flag_1;
  FLAG_2_T flag_2;
}
FLAG_T;

typedef struct
{
  BYTE_T  id;
  INT32_T value;
  FLAG_T  flag;
}
DATA_ITEM_T;

所以现在我可以将 flag 字段解释为 FLAG_1_TFLAG_2_T

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

type
  FLAG_1_T = ( F1_V1, F1_V2, F1_V3 );
  FLAG_2_T = ( F1_V1, F1_V2        );

type
  DATA_ITEM_T = record
    id     : BYTE_T;
    value  : INT32_T;
    flag_1 : FLAG_1_T;
    flag_2 : FLAG_2_T absolute flag_1;
  end;

但是编译失败,语法错误E2029 ';' expected but identifier 'absolute' found

如果我将这些标志声明放在记录类型定义之外(但在与记录类型 def 相同的范围内),它编译得很好:

请注意,这对我要实现的目标毫无用处

type
  FLAG_1_T = ( F1_V1, F1_V2, F1_V3 );
  FLAG_2_T = ( F1_V1, F1_V2        );

type
  DATA_ITEM_T = record
    id     : BYTE_T;
    value  : INT32_T;
  end;

var
  flag_1 : FLAG_1_T;
  flag_2 : FLAG_2_T absolute flag_1;

那么为什么我不能在记录中执行此操作?还有其他方法可以实现吗?

您可以使用带有 variant part:

的记录类型将 C 联合转换为 Delphi
type
  FLAG_T = record
    case Boolean of
      False: (flag_1: FLAG_1_T);
      True: (flag_2: FLAG_2_T);
  end;