Ada 记录表示

Ada record representation

我的记录类型如下:

type Rec_T is record
   a : Bit_12_T;
   b : Bit_4_T;
end record;

其中 Bit_12_T is mod 2**12Bit_4_T is mod 2**4

为了告诉编译器这条记录的精确对齐方式,我使用了for use record语句。但是,我想在字节之间拆分 a 字段,所以我尝试按如下方式进行:

for Rec_T use record
   a at 0 range 0 .. 7; -- The 1st byte
   a at 1 range 0 .. 3; -- The 2nd byte
   b at 1 range 4 .. 7;
end record;

显然,这不是这样做的方法,因为编译器会抱怨 "component clause is previously given at line ..."。

问题:是否可以在字节之间拆分组件以及如何拆分?如果不行的话,我是不是应该有a_high和a_low,然后用一些位运算把它们合并在一起?

将位置视为位数组,而不是字节序列。因此这应该有效:

for Rec_T use record
   a at 0 range 0 .. 11; -- bits 0..7 of the 1st byte and bits 0..3 of the 2nd byte
   b at 0 range 12 .. 15; -- bits 4..7 of the second byte
end record;
for Rec_T'Size use 16;

有关详细信息,请参阅 documentation here,特别是页面末尾的示例,它显示了类似的情况。