Pascal - Records

Gli array Pascal ti consentono di definire il tipo di variabili che possono contenere diversi elementi di dati dello stesso tipo, ma un record è un altro tipo di dati definito dall'utente disponibile in Pascal che ti consente di combinare elementi di dati di diversi tipi.

I record sono costituiti da diversi campi. Supponi di voler tenere traccia dei tuoi libri in una biblioteca, potresti voler tenere traccia dei seguenti attributi su ogni libro:

  • Title
  • Author
  • Subject
  • ID libro

Definizione di un record

Per definire un tipo di record, è possibile utilizzare l'istruzione di dichiarazione del tipo. Il tipo di record è definito come -

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

Ecco il modo in cui dichiareresti il ​​record del libro:

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;

Le variabili record vengono definite nel modo consueto come

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

In alternativa, puoi definire direttamente una variabile del tipo di record come -

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;

Accesso ai campi di un record

Per accedere a qualsiasi campo di un record, utilizziamo l'operatore di accesso ai membri (.). L'operatore di accesso ai membri è codificato come un periodo tra il nome della variabile del record e il campo a cui si desidera accedere. Di seguito è riportato l'esempio per spiegare l'uso della struttura:

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.

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

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

Registra come argomenti di sottoprogramma

È possibile passare un record come argomento di un sottoprogramma in modo molto simile quando si passa qualsiasi altra variabile o puntatore. Si accederà ai campi del record nello stesso modo in cui è stato eseguito l'accesso nell'esempio precedente:

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.

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

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

Puntatori ai record

Puoi definire puntatori ai record in modo molto simile mentre definisci il puntatore a qualsiasi altra variabile come segue:

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

Ora è possibile memorizzare l'indirizzo di una variabile di tipo record nella variabile puntatore sopra definita. Per dichiarare una variabile del tipo di puntatore creato, usa la parola chiave var -

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

Prima di utilizzare questi puntatori, è necessario creare spazio di archiviazione per una variabile di tipo record-name, che verrà manipolata da questi puntatori.

new(r1);
new(r2);

Per accedere ai membri di un record utilizzando un puntatore a quel record, è necessario utilizzare ^. operatore come segue -

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

Infine, non dimenticare di gettare lo stoccaggio usato, quando non è più in uso -

dispose(r1);
dispose(r2);

Riscriviamo il primo esempio utilizzando un puntatore al record Libri. Spero che questo sia facile per te capire il concetto -

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.

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

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 dichiarazione With

Abbiamo discusso del fatto che è possibile accedere ai membri di un record utilizzando l'operatore di accesso ai membri (.). In questo modo il nome della variabile record deve essere scritto ogni volta. IlWith L'istruzione fornisce un modo alternativo per farlo.

Guarda il seguente snippet di codice tratto dal nostro primo esempio:

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

Lo stesso compito potrebbe essere scritto usando il With dichiarazione come -

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