レコード
目次
レコード型は,1 つの変数で複数のデータを扱えるようにしたデータ型です。
次のプログラムは,人間を表す person レコード型を定義したものです。
program sample(output);
type
person = record
name : string(256);
age : integer
end;
var
p : person;
begin
p.name := 'Nagao';
p.age := 20;
writeln(p.name);
writeln(p.age)
end.
レコード型の定義は,record ... end の中にフィールドの宣言を書いたものです。
レコードの各フィールドにアクセスするには,p.name のように書きます。
with 文
with 文を用いると,レコード名を書かずにレコード要素にアクセスできます。
program sample(output);
type
person = record
name : string(256);
age : integer
end;
var
p : person;
begin
with p do { with 文中では p. を省略できる }
begin
name := 'Nagao';
age := 20;
writeln(name);
writeln(age)
end
end.
固定部/可変部
レコード型は,メンバが独立したメモリ領域を持つ固定部と,メンバがメモリ領域を共有する可変部を持つことができます。
固定部は C の構造体,可変部は C の共用体に相当します。
先の person レコード型は,固定部のみを持つレコード型です。
次に示すプログラムでは,可変部のみを持つレコード型を定義しています。
program sample(output);
type
shape = record
case flag : (circ, rect) of
circ : (radius : real);
rect : (width, height : real);
end;
var
s : shape;
begin
s.flag := circ;
s.radius := 2.0;
writeln(s.radius:0:2); { 2.00 }
writeln(s.width:0:2); { 2.00 }
writeln(s.height:0:2); { 意味のない値 }
end.
可変部は次の形式で書きます。
case タグフィールド : タグ型 of
定数 : (フィールドの宣言);
...
タグフィールドは,可変部のどのフィールド群が有効かを示すフラグとして用いられます。