Dátové typy - základné
Všetky premenné majú typ. Free Pascal podporuje niektoré základné typy ako Turbo Pascal, s niektorými ďalšími typmi z Delphi. Programátor môže definovať aj svoje vlastné typy, ktoré sú v podstate definíciou identifikátora, ktorý môže byť použitý na určenie tohoto vlastného typu pri deklarácii premennej neskôr v zdrojovom kóde.
Obsah článku
Deklarácia typu
type
identifikator_typu = typ
FreePascal má sedem hlavných typov:
- jednoduché typy
- reťazcové typy
- štruktúrované typy
- typ ukazovateľ
- procedurálny typ
- všeobecný typ
- špecializovaný typ
- identifikátor typu
Základné typy
Tip
Základné alebo aj jednoduché typy FreePascalu sú typy Delphi.
Poradové typy
S výnimkou typov int64
, qword
a Real
, sú všetky základné typy
poradovými typmi. Poradový typ má nasledujúce vlastnosti:
- Poradové typy sú počítateľné a zoradené, tj. je možné začať ich
počítať jeden po druhom, v zadanom poradí. Táto vlastnosť dovoľuje na
poradových typoch definovať operácie alebo funkcie ako
Inc
,Ord
,Dec
- Poradové hodnoty majú najmenšiu možnú hodnotu. Pokus o použitie
funkcie
Pred
na najmenšej hodnote vygeneruje chybu kontroly rozsahu, ak kontrola rozsahu zapnutá. - Poradové hodnoty majú maximálnu možnú hodnotu. Pokus o použitie
funkcie
Succ
na najväčšiu hodnotu vygeneruje chybu kontroly rozsahu, ak kontrola rozsahu zapnutá.
Celočíselné typy
Základnym celočíselným typom je Integer
. Definícia typov Cardinal
a
Integer
sa môže meniť podľa architektúry a použitého módu prekladača a
majú väčšinou rovnakú veľkosť ako základ cieľovej architektúry. Pre typ
Integer
platí:
- v predvolenom režime Free Pascal mapuje typ
Smalint
. - v režime Delphi alebo ObjFPC mapuje na
Longint
aleboInt64
.
Typ Cardinal
je mapovaný na typ Longword
.
Typy QWord
a Int64
nie sú pravé poradové typy, takže niektoré
konštrukcie Pascalu na nich fungovať nebudú.
Typ | Rozsah | Veľkosť v B |
---|---|---|
Byte | 0 .. 255 | 1 |
Shortint | -128 .. 127 | 1 |
Smallint | -32 768 .. 32 767 | 2 |
Word | 0 .. 65 535 | 2 |
Integer | jeden z Smallint, Longint alebo Int64 | 2, 4 alebo 8 |
Cardinal | jeden z Word, Longword alebo QWord | 2, 4 alebo 8 |
Longint | -2 147 483 648 .. 2 147 483 647 | 4 |
Longword | 0 .. 4 294 967 295 | 4 |
Int64 | -9 223 372 036 854 775 808 .. 9 223 372 036 854 775 807 | 8 |
QWord | 0 .. 18 446 744 073 709 551 615 | 8 |
Vo výrazoch, v ktorých sú použité rôzne celočíselné typy vykonáva Free Pascal automatickú konverziu typov.
Zistenie hraničných hodnôt
begin
// Pre iné typy si zmeňte Integer na príslušný typ
ShowMessage('Minimálna hodnota = '+IntToStr(Low(Integer)));
ShowMessage('Maximálna hodnota = '+IntToStr(High(Integer)));
end;
Logické typy
Free Pascal podporuje logický typ s jeho dvoma preddefinovanými
hodnotami True
a False
. Podporuje aj typy ByteBool
, WordBool
a
LongBool
. Logickému typu možno priradiť len jednu z dvoch hodnôt a,
samozrejme aj, každý výraz, ktorý vracia logickú hodnotu.
Meno | Veľkosť | Ord(True) |
---|---|---|
Boolean | 1 | 1 |
ByteBool | 1 | nenulová hodnota |
WordBool | 2 | nenulová hodnota |
LongBool | 4 | nenulová hodnota |
Za predpokladu, že B
je typu Boolean, toto sú platné priradenia:
Priradenia logických hodnôt
B := True;
B := False;
B := 1<>2; { Results in B := True }
Vymenované typy
Free Pascal, oproti Turbo Pascalu, umožňuje aj rozšírenie vymenovaných typov v štýle C, kde môže byť priradená hodnota príslušnému elementu vymenovaného zoznamu. Pri použití priradených vymenovaných typov, musia byť priradené elementy vo vzostupnom číselnom poradí, inak sa bude prekladač sťažovať. Výrazy, použité v priradení vymenovaných elemntov, musia byť známe v dobe prekladu.
Príklad správnenej deklarácie vymenovaného typu:
Definícia vymenovaného typu
Type
SvetovaStrana = ( Sever, Vychod, Juh, Zapad );
Definícia vymenovaného typu v štýle C
Type
VymenTyp = (jedna, dva, tri, styridsat := 40,styridsatjedna);
Ako výsledok, poradové číslo hodnoty styridsat
bude 40 a nie 3, tak
by bolo, ak by nebolo zadané := 40
. Poradová hodnota položky
styridsatjedna
bude 41 a nie 4, ako by bolo bez priradenia hodnoty.
Pri priraďovaní hodnôt vamonovaným položká je treba mať neustále na
pamäti, že vymenované prvky musia byť udržiavané vo vzostupnom poradí.
takáto definícia vygeneruje chybu prekladača:
Chybná definícia v štýle C
Type
EnumType = (one, two, three, forty := 40, thirty := 30);
Pri používaní vymenovaných typov je treba mať na pamäti:
- Funkcie
Pred
aSucc
nemôžu byť použité na tento typ vymenovaných typov, inak dostanete chybu prekladača. - Vymenované typy sú uchovávané pomocou predvolenej veľkosti, táto
môže byť zmená pomocou direktívy prekladača
{$PACKENUM n}
, ktorá udáva minimálny počet bajtov použitýchpre vymenovaný typ:
Zmena veľkosti
Type
{$PACKENUM 4}
LargeEnum = ( BigOne, BigTwo, BigThree );
{$PACKENUM 1}
SmallEnum = ( one, two, three );
Var S : SmallEnum;
L : LargeEnum;
begin
WriteLn("Small enum : ", SizeOf(S));
WriteLn("Large enum : ", SizeOf(L));
end.
Ktoré po spustení vypíše:
Small enum : 1
Large enum : 4
Podrozsahové typy
Podrozsahový typ je rozsah hodnôt poradového typu (hosťovský typ). Pre definovanie podrozsahového typu je treba zadať hraničné hodnoty – najmenšiu a najväčšiu hodnotu:
Definícia podrozsahu
Type
Longint = $80000000..$7fffffff;
Integer = -32768..32767;
Shortint = -128..127;
Byte = 0..255;
Word = 0..65535;
Je možné definovať aj podrozsahy vymenovaných premenných:
Podrozsah vymenovaných typov
Type
Days = (monday,tuesday,wednesday,thursday,friday,saturday,sunday);
WorkDays = monday .. friday;
WeekEnd = Saturday .. Sunday;
Reláne typy
Free Pascal používa pre všetky výpočty s plávajúcou čiarkou
matematický koprocesor (alebo jeho emuláciu). Pôvodný typ Real
je
závislý na procesore, ale je buď typu Single
alebo Double
.
Podporované sú len IEEE typyplávajúcej čiarky a tieto závisia na
cieľovom procesore a voľbách emulátora.
Typ | Rozsah | Významné číslice | Veľkosť |
---|---|---|---|
Real | závisí na platforme | ??? | 4 alebo 8 |
Single | 1.5E-45 .. 3.4E38 | 7-8 | 4 |
Double | 5.0E-324 .. 1.7E308 | 15-16 | 8 |
Extended | 1.9E-4932 .. 1.1E4932 | 19-20 | 10 |
Comp | -2E64+1 .. 2E63-1 | 19-20 | 8 |
Currency | -922337203685477.5808.. 922337203685477.5807 | 8 |
- typ
Comp
je v skutočnosti 64-bitovýInteger
a nie je dostupný na všetkých cieľových platformách - typ
Currency
je reálny typ s pevnou desatinnou čiarkou, ktorý je interne používaný ako 64-bitový typInteger
(automaticky zväčšovaný násobiteľom 10000), čo minimalizuje chyby zaokrúhľovania.