跳转至内容

Ada 编程/表示子句

来自维基教科书,开放的书籍,开放的世界

Ada. Time-tested, safe and secure.
Ada. 经久耐用、安全可靠。

有几种形式可以指定项目的表示。

type Day_Of_Month is range 1 .. 31;
for  Day_Of_Month'Size      use 8;  -- 8 bits
for  Day_Of_Month'Alignment use 1;  -- 1 byte

记录表示子句指定记录的布局 方面。对于任何组件,可以给出组件子句,指定其在记录对象中的位置,通过其相对于地址(称为位置)的存储单元偏移量以及在该位置占用的位(称为First_BitLast_Bit

Component_Name at Position range First_Bit .. Last_Bit;

这三个表达式必须是静态的,非负的,并且是任何整数类型;它们具有相应的 属性 'Position、'First_Bit 和 'Last_Bit。请注意,位范围可能远远超出存储单元边界。没有组件子句的组件将位于编译器选择的任何位置。

示例

type Device_Register is record
   Ready : Status_Flag;
   Error : Error_Flag;
   Data  : Unsigned_16;
end record;

for  Device_Register use record
   Ready at 0 range  0 ..  0;
   Error at 0 range  1 ..  1;
   -- Reserved bits
   Data  at 0 range 16 .. 31;
end record;

或者,具有相同的结果

for  Device_Register use record
   Ready at 0 range 0 ..  0;
   Error at 0 range 1 ..  1;
   -- Reserved bits
   Data  at 1 range 0 .. 15;
end record;

布局当然取决于机器架构是小端还是大端。相应的 属性 称为 'Bit_Order

对于本机位顺序中的 Data 组件,'Position、'First_Bit 和 'Last_Bit 在两种情况下都将返回 1、0 和 15。

有偏表示

[编辑 | 编辑源代码]

对于某些组件,可以采用所谓的有偏表示。对于类型 T,属性 'Size 将返回 10,但由于它只有 8 个值,因此 3 位就足够了。可以使用以下规范强制执行此操作

type T is range 1000 .. 1007;
type Rec is record
   A: Integer range 0 .. 1;
   B: Boolean;
   C: T;
end record;
for Rec use record
   B at 0 range 0 .. 1;
   C at 0 range 4 .. 6;  -- biased representation
end record;

请注意,类型 T 不需要大小子句。因此,当记录组件和类型 T 的独立对象相互赋值时,会以两种方式执行表示更改

另请注意,对于组件 A,编译器可以自由选择位置 0 的任何剩余位,但也可以在位置 1 使用与给定实现中整数所需的位数一样多的位。

枚举表示子句使用命名聚合指定枚举类型的编码 方面

type Status_Flag is  (Ready, Wait);
for  Status_Flag use (Ready => 0, Wait => 1);  -- confirming clause

另一种表示

for  Status_Flag use (Ready => 0, Wait => 2#100#);

文字的表达式必须是静态的,并且是任何整数类型。这些值不得与顺序冲突。

方面包

[编辑 | 编辑源代码]

对于数组和记录,可以使用 方面 包。它指定,对于每个组件,将使用与应用于其子类型的属性 'Size 返回的位数一样多的位。

华夏公益教科书