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

时间:2015-06-03 19:43:07

标签: delphi record discriminated-union

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

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

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

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;

那为什么我不能在记录中这样做呢?还有另一种方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:4)

您可以使用带有variant part的记录类型将C联合转换为Delphi:

type
  FLAG_T = record
    case Boolean of
      False: (flag_1: FLAG_1_T);
      True: (flag_2: FLAG_2_T);
  end;