MFF UK / Ústav teoretické fyziky / Tomáš Ledvinka |
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á 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. |
. |