Pascal-records

提供:Dev Guides
移動先:案内検索

パスカル-レコード

Pascal配列を使用すると、同じ種類の複数のデータ項目を保持できる変数のタイプを定義できますが、レコードはPascalで使用できる別のユーザー定義データ型であり、異なる種類のデータ項目を組み合わせることができます。

レコードはさまざまなフィールドで構成されています。 あなたが図書館であなたの本を追跡したい場合、あなたは各本について次の属性を追跡したいかもしれません-

  • タイトル
  • 著者
  • 件名
  • ブックID

レコードを定義する

レコードタイプを定義するには、タイプ宣言ステートメントを使用できます。 レコードタイプは次のように定義されています-

type
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

以下は、Bookレコードを宣言する方法です-

type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

レコード変数は通常の方法で次のように定義されます

var
   r1, r2, ... : record-name;

または、レコードタイプ変数を直接定義できます-

var
Books : record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

レコードのフィールドへのアクセス

レコードの任意のフィールドにアクセスするには、メンバーアクセス演算子(。)を使用します。 メンバーアクセス演算子は、レコード変数名とアクセスするフィールドの間のピリオドとしてコーディングされます。 以下は、構造の使用法を説明する例です-

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; ( *Declare Book1 and Book2 of type Books* )

begin
   ( *book 1 specification* )
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali ';
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

   ( *book 2 specification* )
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;

   ( *print Book1 info* )
   writeln ('Book 1 title : ', Book1.title);
   writeln('Book 1 author : ', Book1.author);
   writeln( 'Book 1 subject : ', Book1.subject);
   writeln( 'Book 1 book_id : ', Book1.book_id);
   writeln;

   ( *print Book2 info* )
   writeln ('Book 2 title : ', Book2.title);
   writeln('Book 2 author : ', Book2.author);
   writeln( 'Book 2 subject : ', Book2.subject);
   writeln( 'Book 2 book_id : ', Book2.book_id);
end.

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

サブプログラムの引数としての記録

他の変数またはポインターを渡すのと非常によく似た方法で、レコードをサブプログラムの引数として渡すことができます。 あなたは上記の例でアクセスしたのと同様の方法でレコードフィールドにアクセスします-

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; ( *Declare Book1 and Book2 of type Books* )

( *procedure declaration* )
procedure printBook( var book: Books );

begin
   ( *print Book info* )
   writeln ('Book  title : ', book.title);
   writeln('Book  author : ', book.author);
   writeln( 'Book  subject : ', book.subject);
   writeln( 'Book book_id : ', book.book_id);
end;

begin
   ( *book 1 specification* )
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali ';
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

   ( *book 2 specification* )
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;

   ( *print Book1 info* )
   printbook(Book1);
   writeln;

   ( *print Book2 info* )
   printbook(Book2);
end.

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

レコードへのポインター

次のように他の変数へのポインタを定義するのと非常に似た方法でレコードへのポインタを定義できます-

type
record-ptr = ^ record-name;
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

これで、レコードタイプ変数のアドレスを上記で定義したポインター変数に格納できます。 作成されたポインタ型の変数を宣言するには、varキーワードを使用します-

var
   r1, r2, ... : record-ptr;

これらのポインタを使用する前に、これらのポインタによって操作されるレコード名型変数のストレージを作成する必要があります。

new(r1);
new(r2);

そのレコードへのポインターを使用してレコードのメンバーにアクセスするには、^を使用する必要があります。 次のような演算子-

r1^.feild1 := value1;
r1^.feild2 := value2;
...
r1^fieldn := valuen;

最後に、使用されなくなったストレージを廃棄することを忘れないでください-

dispose(r1);
dispose(r2);

Booksレコードへのポインターを使用して、最初の例を書き直しましょう。 これはあなたが概念を理解するのが簡単になることを願っています-

program exRecords;
type
BooksPtr = ^ Books;
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
  ( *Declare Book1 and Book2 of pointer type that refers to Book type* )
   Book1, Book2: BooksPtr;

begin
   new(Book1);
   new(book2);

   ( *book 1 specification* )
   Book1^.title  := 'C Programming';
   Book1^.author := 'Nuha Ali ';
   Book1^.subject := 'C Programming Tutorial';
   Book1^.book_id := 6495407;

   ( *book 2 specification* )
   Book2^.title := 'Telecom Billing';
   Book2^.author := 'Zara Ali';
   Book2^.subject := 'Telecom Billing Tutorial';
   Book2^.book_id := 6495700;

   ( *print Book1 info* )
   writeln ('Book 1 title : ', Book1^.title);
   writeln('Book 1 author : ', Book1^.author);
   writeln( 'Book 1 subject : ', Book1^.subject);
   writeln( 'Book 1 book_id : ', Book1^.book_id);

   ( *print Book2 info* )
   writeln ('Book 2 title : ', Book2^.title);
   writeln('Book 2 author : ', Book2^.author);
   writeln( 'Book 2 subject : ', Book2^.subject);
   writeln( 'Book 2 book_id : ', Book2^.book_id);

   dispose(Book1);
   dispose(Book2);
end.

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Withステートメント

レコードのメンバーには、メンバーアクセス演算子(。)を使用してアクセスできることを説明しました。 この方法では、レコード変数の名前を毎回書き込む必要があります。 With ステートメントは、これを行うための代替方法を提供します。

最初の例から取られた次のコードスニペットを見てください-

   ( *book 1 specification* )
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali ';
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

同じ割り当ては、 With ステートメントを使用して記述できます-

( *book 1 specification* )
With Book1 do
begin
   title  := 'C Programming';
   author := 'Nuha Ali ';
   subject := 'C Programming Tutorial';
   book_id := 6495407;
end;