Adaの日本語情報を増やす(2)

Ada勉強メモ。今日は配列について。すごく強力。

-- 値を保持したいだけなら無名の配列型を使うのが楽ちん。
X : array(1 .. 10) of Boolean;
-- ちなみに、実はこれは省略記法で、暗黙のうちにIntegerとされている。つまり次の式と等価。
X : array(Integer range 1 .. 10) of Boolean;
-- 添字はなにも数字じゃなくてもよい。
X : array(Character range 'a' .. 'z') of Boolean;


-- 上記のような無名の配列型が許されるのは変数宣言の場合のみ。
-- recordの要素などにはつかえない。つまり...
-- あらかじめ(正確には、部分)配列型を定義しておき、
type Answer10_Array is array(Integer range 1 .. 10) of Boolean;

type Exam is record
   Name : Unbounded_String;

-- recodrdの要素の型には宣言済みのものをつかう。
   Answers :  Answer10_Array;

-- これは Error
-- Answers :  array(Integer range 1 .. 10) of Boolean;
end Exam;


-- 正式な「配列型」は添字の範囲が決まっていないものを指す
type Answer_Array is array(Integer range <>) of Boolean;

-- 「今日は50問なので、1から50までの添字にする」のような使い方ができる
Todays_Answers : Answer_Array(1 .. 50);
Lastweeks_Answers : Answer_Array(1 .. 30);
Nextweeks_Answers : Answer_Array(1 .. 30);

-- ちなみに、型として宣言すれば
-- 要素数が同じ場合には代入が可能となる
-- 数さえ同じなら、添字がずれていても問題ない
Lastweeks_Answers := Nextweeks_Answers;

-- さらに比較も可能だったりする
-- 要素数が同じで、かつ各要素が = なら TRUEになる
if Todays_Answers = Lastweeks_Answers
   ...
end if;


-- subtypeも定義できるので、
-- たとえば、「小テスト」が毎回20問ならば、部分型を定義して使い回せる
subtype Mini_Exam_Answer_Array is Answer_Array(1 .. 20);
Tommorows_Answers : Mini_Exam_Answer_Array;
Yesterdays_Answers : Mini_Exam_Answer_Array;


-- ちなみに、最初の無名の配列型は毎回違う部分型が暗黙のうちに定義されているものとされる。
X : array(1 .. 10) of Integer;
Y : array(1 .. 10) of Integer;
-- この場合、XとYはまったく違う型として処理される。
-- イメージとしてはこんな感じ。
type Integer_Array_X is array(1 .. 10) of Integer;
X : Integer_Array_X;
type Integer_Array_Y is array(1 .. 10) of Integer;
Y : Integer_Array_XY;

閑話休題。

俺がこの世でただ一つ我慢できんのは―――Constraint_Errorで落ちるAdaプログラムだ!

いくらAdaでも、例外を拾い損ねれば落ちます。