【问题标题】:Ada record representationAda 记录表示
【发布时间】:2016-08-23 23:15:51
【问题描述】:

我的记录类型如下:

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;

显然,这不是这样做的方法,因为编译器会抱怨“组件子句以前在...行给出”。

问题: 是否可以在字节之间拆分组件以及如何做到这一点?如果不可能的话,我是不是应该有a_high和a_low,然后使用一些位操作将它们合并在一起?

【问题讨论】:

    标签: record ada


    【解决方案1】:

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

    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,特别是页面末尾的示例,该示例显示了类似的情况。

    【讨论】:

    • 感谢您的建议。我已经看过这个例子了;但是,它只显示了如何将各个字段对齐到字节中,而不是如何在字节之间拆分单个字段。
    • @NeoSer 再次阅读文档。 first_bitlast_bit 属于同一字节没有限制。将底层存储视为一个长而连续的位数组。
    • Ondrej,不应该是for Rec_T’Size use 16;吗?
    • 是的,可以指定for Rec_T'Size use 16;,但这只是说明记录应该适合16位。实际上,可以使用任意数量的位,for Rec_T use record 中未使用的位将被“标记”为未使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多