Pascal - Records

Les tableaux Pascal vous permettent de définir le type de variables pouvant contenir plusieurs éléments de données du même type, mais un enregistrement est un autre type de données défini par l'utilisateur disponible dans Pascal qui vous permet de combiner des éléments de données de différents types.

Les enregistrements se composent de différents champs. Supposons que vous souhaitiez garder une trace de vos livres dans une bibliothèque, vous souhaiterez peut-être suivre les attributs suivants pour chaque livre -

  • Title
  • Author
  • Subject
  • ID du livre

Définition d'un enregistrement

Pour définir un type d'enregistrement, vous pouvez utiliser l'instruction de déclaration de type. Le type d'enregistrement est défini comme -

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

Voici la façon dont vous déclareriez l'enregistrement du livre -

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;

Les variables d'enregistrement sont définies de la manière habituelle comme

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

Vous pouvez également définir directement une variable de type d'enregistrement comme -

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;

Accès aux champs d'un enregistrement

Pour accéder à n'importe quel champ d'un enregistrement, nous utilisons l'opérateur d'accès aux membres (.). L'opérateur d'accès aux membres est codé comme un point entre le nom de la variable d'enregistrement et le champ auquel nous souhaitons accéder. Voici l'exemple pour expliquer l'utilisation de la structure -

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.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

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

Enregistrements en tant qu'arguments de sous-programme

Vous pouvez transmettre un enregistrement en tant qu'argument de sous-programme de la même manière que vous transmettez toute autre variable ou pointeur. Vous accéderiez aux champs d'enregistrement de la même manière que vous avez accédé dans l'exemple ci-dessus -

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.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

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

Pointeurs vers des enregistrements

Vous pouvez définir des pointeurs vers des enregistrements de la même manière que vous définissez le pointeur vers n'importe quelle autre variable comme suit -

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

Vous pouvez maintenant stocker l'adresse d'une variable de type d'enregistrement dans la variable de pointeur définie ci-dessus. Pour déclarer une variable du type pointeur créé, vous utilisez le mot-clé var -

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

Avant d'utiliser ces pointeurs, vous devez créer un stockage pour une variable de type de nom d'enregistrement, qui sera manipulée par ces pointeurs.

new(r1);
new(r2);

Pour accéder aux membres d'un enregistrement à l'aide d'un pointeur vers cet enregistrement, vous devez utiliser ^. opérateur comme suit -

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

Enfin, n'oubliez pas de jeter le stockage utilisé, lorsqu'il n'est plus utilisé -

dispose(r1);
dispose(r2);

Réécrivons le premier exemple en utilisant un pointeur vers l'enregistrement Books. J'espère que ce sera facile pour vous de comprendre le concept -

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.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

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

La déclaration With

Nous avons discuté du fait que les membres d'un enregistrement sont accessibles à l'aide de l'opérateur d'accès aux membres (.). De cette façon, le nom de la variable d'enregistrement doit être écrit à chaque fois. leWith La déclaration fournit une autre façon de le faire.

Regardez l'extrait de code suivant extrait de notre premier exemple -

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

Le même devoir peut être rédigé en utilisant le With déclaration comme -

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