Deklarace typu
Následující řádek deklaruje typ int a to jako integer.
type int = integer;
tím získáme možost ušetřit si trochu psaní. Můžeme ale také napsat
type integer = int64
a naučit náš program počítat místo do 2 147 483 647 až do 9 223 372 036 854 775 807. Tím že takto počínaje touto deklarací zastíníme původní význam identifikátoru si ovšem můžeme přidělat řadu starostí, takže jde o trik nevhodný pro seriózní práci.
Je zřejmé, že takto bychom se daleko nedostali, pouze bychom mohli nazývat star=é věci novým jménem. Pascal přináší řadu dalších způsobů, jak zkonstruovat nový typ.
Typ Interval
Nejjednodušší možností je prohlásit, že proměnná smí nabývat pouze hodnot z jistého intervalu ordinálního typu:
type tCisloPoslance = 1..200; tMalePismeno = 'a'..'z'; tRocnikZS = 1..9;
var PredsedaPK : tCisloPoslance; Vychodil : tRocnikZS;
Takto máme možnost přenechat komilátoru starost o to, aby nám nehlasovalo příliš mnoho poslanců nebo zda vyplnili správně svoji povinnou školní docházku. Prostřednictvím chybových hlášení při kompilaci či běhu se tak můžeme dozvědět o nesrovnalostech.
Uvidíme později, že daleko nejdůležitějším užitím typu interval je určení mezí polí, které chápe Pascal jako zobrazení z intervalu do množiny dané typem prvku pole.
Výčtový typ
Je jakýmsi zobecněním typu interval, kde si můžeme prvky sami pojemnovat a nejde jen o podmnožinu výchozího typu.
type Fukce = (Radovy, ClenVyboru, PredsedaKlubu);
deklaruje nejen nový typ ale též nové hodnoty v podobě
identifikátorů. Kormě funkce ord, která nám dává
ord(Radovy) = 0, atd... máme opět k disposici také succ a
pred, takze plati
succ(Radovy) = pred(PredsedaKlubu)
Pro počítač je tahle deklarace podobná svým významem
následující
const Radovy = 0; ClenVyboru = 1; PredsedaKlubu = 2; type Funkce = Radovy..PresedaKlubu;
ovšem jde o izolovaný ty a nemůžeme do proměnné výčtového typu přiřadit celé číslo. To zvyšuje bepečí při psaní programu.
Pozor identifikátory prvků výčtového typu nám moho něco zastínit, nebo vést ke kolizi, takže i zde musíme dávat pozor při volbě jmen. Situace je velmi podobná té při deklaraci const ClenVyboru = 1;
Někdy má smysl "Maďarská notace":
type tFukce = (eRadovy, eClenVyboru, ePredsedaKlubu);
Zde je jiný příklad:
type tKarty = ( ZelenaSedma, ZaludovaSedma, KulovaSedma, SrdcovaSedma, ZelenaOsma, ZaludovaOsma, KulovaOsma, SrdcovaOsma, ZelenaDevitka, ZaludovaDevitka, KulovaDevitka, SrdcovaDevitka, ZelenaDesitka, ZaludovaDesitka, KulovaDesitka, SrdcovaDesitka, ZelenySpodek, ZaludovySpodek, KulovySpodek, SrdcovySpodek, ZelenySvrsek, ZaludovySvrsek, KulovySvrsek, SrdcovySvrsek, ZelenyKral, ZaludovyKral, KulovyKral, SrdcovyKral, ZeleneEso, ZaludoveEso, KuloveEso, SrdcoveEso );
type tSedmy = ZelenaSedma..SrdcovaSedma; tOsmy = ZelenaOsma..SrdcovaOsma; {...}
var SedmaKDalsimuPouziti : tSedmy; LibovolnaKarta : tKarty;
begin LibovolnaKarta := ZaludovyKral; SedmaKDalsimuPouziti := SrdcovaOsma; //[Error] pokus.dpr(28): Constant expression violates subrange bounds ... LibovolnaKarta := ZaludovyKral; SedmaKDalsimuPouziti := LibovolnaKarta; writeln( ord(SedmaKDalsimuPouziti)); // Writeln neumi vypsat vyraz vyctoveho typu readln; end.