跳轉至內容

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 返回的位數一樣多的位。

華夏公益教科書