我正在尝试与一个嵌入式系统进行交互,该系统以相当简单的格式传输和接收数据,但具有严格的大小要求。
在 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_T
或FLAG_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/