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

标签 delphi record discriminated-union

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

在 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 .

如果我将这些标志声明置于记录类型定义之外(但与记录类型定义的范围相同),则它可以正常编译:

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

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;

关于delphi - 记录类型中的绝对寻址字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30629232/

相关文章:

c# - 在 Entity Framework Core 上禁用 AutoDetectChanges

typescript - 如何在 TypeScript 的泛型函​​数中使用判别式?

delphi - Delphi主从网格组件

delphi - 关于 Firemonkey (Delphi) 中的 TidHttp、mshtml、ActiveX、COMObj

delphi - Indy 9 与 Lazarus/Free Pascal 兼容吗

ios - XE4 iOS 应用程序 : Unable to install package. (e8008015)

function - 在多个命名空间中使用记录

具有不同字段名称的记录的 haskell 变体

f# - 可区分联合中类型之间的转换

c++ - 关于 C++ 非 POD union 的问题