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;