レコード

レコード型は,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
  定数 : (フィールドの宣言);
  ...

タグフィールドは,可変部のどのフィールド群が有効かを示すフラグとして用いられます。