Kategória: ObjectPascal

Zmenené: 8. december 2008

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.

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 alebo Int64.

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:

  1. Funkcie Pred a Succ nemôžu byť použité na tento typ vymenovaných typov, inak dostanete chybu prekladača.
  2. 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ý typ Integer (automaticky zväčšovaný násobiteľom 10000), čo minimalizuje chyby zaokrúhľovania.