VI. |
DATOVÉ TYPY |
Typ datového objektu specifikuje jednak množinu jeho přípustných hodnot, jednak množinu definovaných operací, které lze nad těmito hodnotami provádět. V předchozích kapitolách byly probrány některé standardní datové typy, jejichž množiny hodnot i operací jsou předdefinovány jazykem. Turbo Pascal však umožňuje i použití typů uživatelských, které je však nutno v programu nejprve deklarovat. Pro tyto účely poskytuje několik konstrukcí, tzv. obecných neboli abstraktních datových typů, pro něž jsou předdefinovány množiny operací, nikoli však množiny hodnot. Definice množiny hodnot konkrétního uživatelského typu, vycházejícího z některého typu obecného, je pak předmětem jeho deklarace v programu. Každý z obecných typů tedy představuje celou třídu konkrétních uživatelských typů se společnou množinou operací a obecně různými množinami hodnot. Celkem je k dispozici devět obecných typů:
• typ výčet • typ interval • typ pole |
• typ řetězec • typ záznam • typ množina |
• typ soubor • typ ukazatel • typ procedura |
Každému z obecných typů odpovídá v syntaxi jazyka speciální konstrukce — popis typu. V popisu typu je specifikována množina hodnot typu, čímž je určen konkrétní typ dané třídy obecných typů. Například:
V obou uvedených příkladech rezervovaná slova set of určují, že se jedná o popis množinového typu. Pro hodnoty obou těchto typů jsou tedy dostupné například množinové operace sjednocení, rozdílu a průniku. Volitelná část popisu pak specifikuje, že množinou hodnot příslušného konkrétního typu jsou množiny znaků (jejich prvky jsou typu Char) resp. množiny celých čísel z intervalu od 0 do 255 (jejich prvky jsou typu Byte).set of Char set of Byte
Popis typu se může vyskytovat buď přímo v deklaraci proměnné nebo v deklaraci typu v úseku deklarací typů. V prvém případě je deklarované proměnné přidělen typ nepojmenovaný, ve druhém se deklarací zavádí identifikátor typu, použitelný na dalších místech v programu:
Syntax úseku deklarací typů popisuje syntaktický diagram na obrázku 30. Za právě deklarovaným identifikátorem typu a symbolem = lze uvést namísto popisu identifikátor jiného (již deklarovaného) typu. Tato možnost dovoluje deklarovat totožné typy, lišící se pouze identifikátory — přidělit jednomu typu více identifikátorů. Každým výskytem popisu typu je naopak definován zcela nový typ, různý od všech ostatních.var M: set of Char; type Mnozina = set of Char; ... var M: Mnozina;
Obrázek 30: Syntax úseku deklarací typů
|
VI.1. |
Identita a kompatibilita typů |
Identita Identita typů je vyžadována mezi formálními a skutečnými parametry podprogramů, volanými odkazem. Typy T1 a T2 jsou identické, je-li splněn některý z následujících předpokladů:
V následujících deklaracích jsou identické pouze typy T1, T2 a T3 — typ T4 je různý od všech ostatních, i když je deklarován stejným popisem. Nesplňuje totiž žádnou z uvedených podmínek identity.
Proměnné jsou identických typů, jestliže typy uvedené v jejich deklaracích jsou identické nebo jestliže jsou všechny (proměnné) deklarovány v deklaraci jediné. V následujících deklaracích jsou identických typů proměnné P1 a P2 resp. P3 a P4, zatímco typy proměnných P5 a P6 jsou různé od všech ostatních.type T1 = array [1 .. 10] of Real; T2 = T1; T3 = T2; T4 = array [1 .. 10] of Real;
Kompatibilita Typová kompatibilita je vyžadována především mezi operandy některých operací. Dva typy jsou kompatibilní, je-li splněn některý z následujících předpokladů:var P1, P2 : array [1 .. 10] of Real; P3 : T1; P4 : T2; P5 : array [1 .. 10] of Real; P6 : array [1 .. 10] of Real;
Kompatibilita vzhledem k přiřazení V přiřazovacích příkazech a při dosazování hodnot skutečných parametrů do hodnotou volaných formálních parametrů podprogramů je vyžadována kompatibilita vzhledem k přiřazení. Typ H dosazované hodnoty je kompatibilní vzhledem k přiřazení s typem P proměnné, je-li splněna některá z následujících podmínek:
Běhová chyba programu může nastat i v případě splněné kompatibility vzhledem k přiřazení, je-li dosazovaná hodnota mimo rozsah hodnot typu P, za předpokladu povolené kontroly rozsahu (direktiva kompilátoru {$R+}). Pokud je však dosazovaná hodnota konstantním výrazem, kontrola rozsahu je bez ohledu na direktivu povolení nebo zákazu provedena již při překladu.