I tipi

Tutte le variabili sono classificate da un tipo.
Il Free Pascal supporta gli stessi tipi base del Turbo Pascal con alcuni tipi extra del Delphi.
Il programmatore può dichiarare i suoi tipi personalizzati , che in pratica significa definire un identificatore che può essere utilizzato per dichiarare una variabile di tipo personalizzato.

-

Ordinal

Ad eccezzione dei tipi int64 , qword e Real tutti i tipi base sono ordinali.
I tipi ordinal hanno le caratteristiche seguenti :

1.
I tipi ordinal definiscono insiemi ordinati di valori , ovvero in una variabile di tipo ordinal è possibile contare i valori in essa contenuti uno ad uno ed in uno specifico ordine.
Questa caratteristica permette l'uso delle funzioni

Inc : incrementa la variabile
Ord : restituisce l'ordinalità di un valore
Dec : decrementa la variabile

2.
I valori ordinal sono caratterizzati da un valore minimo possibile.
Infatti tentando di applicare la funzione Pred(precedente) sul valore più piccolo possibile verrà generato un errore di range se il range check è abilitato.

3.
I valori ordinal sono caratterizzati da un valore massimo possibile.
Infatti tentando di applicare la funzione Succ(successivo) sul valore più frande possibile verrà generato un errore di range se il range check è abilitato.

Integers


Sotto vengono riportati i tipi di interi predefiniti :

Integer
ShortInt
SmallInt
LongInt
LongWord
Int64
Byte
Word
Cardinal
QWord
Boolean
ByteBool
LongBool
Char


Nella tabella che segue vengono riportati gli interi predefiniti nel Free Pascal e i loro range e dimensione.

Tipo Range Dimensione in Byte
Byte 0.. 255 1
ShortInt -128..127 1
SmallInt -32768..32767 2
Word 0.. 65535 2
Integer per entrambi SmallInt , longint o int64 2,4 o 8
Cardina per entrambi word , longword o qword 2,4 o 8
Longint -2147483648.. 2147483647 4
Longword 0.. 4294967295 4
Int64 -9223372036854775808.. 9223372036854775807 8
QWord 0.. 18446744073709551615 8


è da notare che i tipi QWord e Int64 non sono dei veri Ordinal e percio' alcuni construtti del pascal potrebbero non funzionare con questi interi.
Nella modalità predefinita del Free Pascal gli Integer sono mappati (equivalenti) come dei smallint.
I tipi Cardinal sono sempre mappati come dei longword.
La definizione dei Cardinal e integer può cambiare da un'architettura ad un'altra e da una modalità del compilatore ad un'altra.

Il Free Pascal , nelle espressioni che contengono tipi diversi di interi , effettua automaticamente la loro conversione .

Boolean


Il Free Pascal supporta il tipo Booleano con i suoi due valori predefiniti True e False .
Questi sono gli unici due valori che possono essere assegnati ad una variabile Boolean.
Sono anche supportati i tipi ByteBool , WordBool e LongBool.
Nella tabella che segue vengono riportati i tipi boolean predefiniti nel Free Pascal e la loro dimensione.

Nome Dimensione in byte TRUE
Boolean 1 1
ByteBool 1 Tutti i valori diversi da zero
WordBool 2 Tutti i valori diversi da zero
LongBool 4 Tutti i valori diversi da zero


Assumendo che la variabile B sia di tipo boolean le seguenti sono assegnazioni valide :

B := True;
B := False;
B := 1<>2; {Il risultato è B := True }

I tipi Enumerated


Il tipo enumerated serve a definire insiemi ordinati di valori.
Il Free Pascal permette l'uso dei tipi enumerated sia in stile Turbo Pascal che nello stile del linguaggio C .
Nello stile del linguagio C è possibile assegnare un valore ad un particolare elemento della lista di enumerazione.
Quando vengono utilizzati i tipi enumerati assegnati gli elementi devono essere in ordine ascendente all'interno della lista o il compilatore segnalerà un errore.
Le espressioni utilizzate in un elemento enumerato e assegnato devono essere conosciute già al momento della compilazione.
Quelli che seguono sono tipi enumerati corretti :

Type
   Direzioni = ( Nord,Est,Sud,Ovest);

In stile C :
Type
   EnumEsempio = (uno, due, tre , quaranta:=40, quarantuno);

Osservando l'esempio sopra si tenga presente che il valore ordinale (usare la funzione Ord) di tre è 3 quello di quaranta è 40 e quello di quarantuno è 41 perchè il compilatore fornisce all'elemento che segue quello che ha avuto un'assegnazione il valore dell'assegnazione incrementato di uno.
L'assegnazione che segue genera un'errore in aunto le assegnazioni non sono in ordine ascendente :

Type
   EnumEsempio = (uno, due, tre , quaranta:=40, trenta=30);

Per evitare l'errore è necessario mantenere nel corretto ordine le assegnazioni degli elementi quaranta e trenta.
Quando vengono usati i tipi enumerati è necessario tenere a mente i seguenti punti :

1.
Le funzioni Pred e Succ non possono essere utilizzate con questo tipo di dato.
Il loro utilizza genera un errore di compilazione.

2.
I tipi Enumerated vengono salvati usando una dimesione di default.
Questo comportamento può essere cambiato utilizzando la direttiva del compilatore {$PACKENUM n} che dice al compilatore il numero minimo di byte da utilizzare per il tipo Enumerated .

I tipi Subrange


Come dice il nome stesso, questi tipi identificano dei sottoinsiemi di valori appartenenti ad un altro tipo ordinale che viene definito tipo base.
Per definire un tipo subrange, si utilizza la seguente sintassi :

Type
   DieciNumeri = 1..10;

definisce un tipo subrange di nome DieciNumeri che conterrà i valori 1, 2, 3, 4, 5, 6, 7, 8, 9,10 .

-