


 SYSTMOV A PROGRAMTORSK SERVIS MON


















        TURBO PASCAL 5.0 / 5.5
        
                   a
        
        PURE PASCAL pro ATARI ST

               prvn dl



             RNDr. Tom RUBA
             RNDr. Jana  VINOV
             RNDr. Eva   NOVKOV
             RNDr. Tom EHK























           PRAHA, leden 1990






















               Tato prce je vnovna vem astnkm manifestace

                17.listopadu 1989 na Nrodn td v Praze.


                                                            Eva Novkov
                                                            Jana Vinov
                                                            Tom Ruba
                                                            Tom ehk
Pedmluva k prvnmu dlu

     Souasn rozvoj vpoetn techniky a vzrstajc poptvka po
kolench Turbo Pascalu podanch organizac MON si vynutily
vydn skript jako studijnho materilu k tmto kolenm.

                                 Mnoho spch pi prci pej autoi.

Dodatek k pedmluv

     Tento kurs byl pvodn uren pro potae se systmem MeSs DOS, 
ale vcelku bez problm jej mohou pout majitel skvlch 16/32 
bitovch pota ady ATARI ST pro vborn PURE PASCAL firmy 
Application Software Heidelberg, kter je kompatibiln s TURBO 
PASCALEM verze 5.5. Rozdly budou pedevm v popisu ovldn 
jednotlivch program, ale kdy u budete vdt co PP/TP um, nebude 
myslm provst to stejn v ptelskm GEM prosted na Atari. Dal 
drobn rozdly budou v systmov specifickch funkcch MeSs DOSu a PC 
vbec. Dovolil jsem si ji nkter vci siln "pckov" vypustit. 
Pro ten tohoto textu si nainstalujte IBM znakovou sadu s etinou 
Kamenickch. Pokud byste mli problmy pi programovn na Atari, 
obrate se na ne uvedenou adresu. Co nevm nepovm.

		Ataristm zdar
				
				Martin Hejral
				Rovensko p.Tr. 284
				512 63


***************************************************************
     STAV SOUBORU: 28.11.1994             13630 dk
***************************************************************



OBSAH                                                       Strana:


VOD . . . . . . . . . . . . . . . . . . . . . . . . . . .    7

1. JAK ZAT . . . . . . . . . . . . . . . . . . . . . . .   10
   1.1. Podmnky pro prci v Turbo Pascalu verze 5.5 . . .   10
      1.1.1. Minimln konfigurace potaovho systmu  .   10
      1.1.2. Koprocesor  . . . . . . . . . . . . . . . . .   10
   1.3. Prvn pouit integrovanho systmu  . . . . . . .   16
   1.4. Zkladn pojmy . . . . . . . . . . . . . . . . . .   22
      1.4.1. Definice zkladnch pojm . . . . . . . . . .   23
      1.4.2. Forma zpisu syntaxe jazyka . . . . . . . . .   26
      1.4.3. Vyjadovac prostedky jazyka Turbo Pascal  .   27
      1.4.4. Program . . . . . . . . . . . . . . . . . . .   29
      1.4.5. Komente . . . . . . . . . . . . . . . . . .   29

2. TYPY  . . . . . . . . . . . . . . . . . . . . . . . . .   31
   2.1. vod . . . . . . . . . . . . . . . . . . . . . . .   31
      2.1.1. Pojem typu  . . . . . . . . . . . . . . . . .   31
      2.1.2. Deklarace promnnch  . . . . . . . . . . . .   32
      2.1.3. Deklarace konstant  . . . . . . . . . . . . .   32
      2.1.4. Omezen . . . . . . . . . . . . . . . . . . .   35
      2.1.5. Co se ve k typu . . . . . . . . . . . . . .   35
   2.2. Jednoduch typy  . . . . . . . . . . . . . . . . .   36
      2.2.1. Celoseln typy  . . . . . . . . . . . . . .   37
      2.2.2. Reln sla  . . . . . . . . . . . . . . . .   39
      2.2.3. Typ boolean . . . . . . . . . . . . . . . . .   45
      2.2.4. Typ char  . . . . . . . . . . . . . . . . . .   46
      2.2.5. etzce . . . . . . . . . . . . . . . . . . .   47
      2.2.6. Ukazatele . . . . . . . . . . . . . . . . . .   51
   2.3. Ordinln typy . . . . . . . . . . . . . . . . . .   54
      2.3.1. Vtov typ . . . . . . . . . . . . . . . . .   55
      2.3.2. Interval  . . . . . . . . . . . . . . . . . .   56
      2.3.3. Funkce nad ordinlnmi typy . . . . . . . . .   57
      2.3.4. Uspodn a relan operace  . . . . . . . .   58
   2.4. Strukturovan typy   . . . . . . . . . . . . . . .   59
      2.4.1. Pole  . . . . . . . . . . . . . . . . . . . .   59
      2.4.2. Zznam  . . . . . . . . . . . . . . . . . . .   61
      2.4.3. Mnoina . . . . . . . . . . . . . . . . . . .   65
      2.4.4. Object  . . . . . . . . . . . . . . . . . . .   67
   2.5. Soubory  . . . . . . . . . . . . . . . . . . . . .   72
   2.6. Procedury a funkce jako promnn . . . . . . . . .   73

3. PKAZY  . . . . . . . . . . . . . . . . . . . . . . .   77
   3.1. Piazovac pkaz . . . . . . . . . . . . . . . .   77
      3.1.2. Piazovn hodnot  . . . . . . . . . . . . .   84
   3.2. dc pkazy . . . . . . . . . . . . . . . . . .   90
      3.2.1. Zkladn pkazy  . . . . . . . . . . . . . .   90
      3.2.2. Pkazy vtven . . . . . . . . . . . . . . .   91
      3.2.3. Pkazy cyklu . . . . . . . . . . . . . . . .   93
      3.2.4. Pkaz skoku  . . . . . . . . . . . . . . . .   95
      3.2.5. Pkaz WITH . . . . . . . . . . . . . . . . .   97
   3.3. Operace vstupu a vstupu . . . . . . . . . . . . .   99
   3.4. Podprogramy  . . . . . . . . . . . . . . . . . . .  100
      3.4.1. Strukturovan programovn  . . . . . . . . .  100
      3.4.2. Zpis podprogram . . . . . . . . . . . . . .  102
      3.4.3. Pedvn parametr . . . . . . . . . . . . .  104
      3.4.4. Lokalita identifiktor . . . . . . . . . . .  106
      3.4.5. Tlo podprogramu  . . . . . . . . . . . . . .  108
      3.4.6. Rekurze . . . . . . . . . . . . . . . . . . .  108
      3.4.7. Algoritmus voln procedur  . . . . . . . . .  110

4. INTEGROVAN SYSTM  . . . . . . . . . . . . . . . . . .  118
   4.1. Prce s editorem . . . . . . . . . . . . . . . . .  129
      4.1.1. Zkladn pkazy  . . . . . . . . . . . . . .  131
      4.1.2. Pkazy pro prci s bloky . . . . . . . . . .  133
      4.1.3. Pepnae editoru . . . . . . . . . . . . . .  135
      4.1.4. Speciln pkazy . . . . . . . . . . . . . .  136
      4.1.5. Pepnae a parametry IS tkajc se prce
             s editorem  . . . . . . . . . . . . . . . . .  139
      4.1.6. Omezen editoru . . . . . . . . . . . . . . .  140
   4.2. Spoluprce s operanm systmem  . . . . . . . . .  141
      4.2.1. Aktuln adres  . . . . . . . . . . . . . .  141
      4.2.2. Zaveden souboru do editoru . . . . . . . . .  142
      4.2.3. Vytvoen novho souboru  . . . . . . . . . .  144
      4.2.4. Uloen souboru na disk . . . . . . . . . . .  145
      4.2.5. Nvrat do operanho systmu  . . . . . . . .  146
   4.3. Peklad  . . . . . . . . . . . . . . . . . . . . .  146
      4.3.1. Pekldan soubory  . . . . . . . . . . . . .  147
      4.3.2. Peklad a sestaven programu  . . . . . . . .  147
      4.3.3. Direktivy kompiltoru . . . . . . . . . . . .  150
      4.3.4. Podmnn peklad . . . . . . . . . . . . . .  160
      4.3.5. Pepnae linkovn . . . . . . . . . . . . .  164
   4.4. Bh programu   . . . . . . . . . . . . . . . . . .  166
      4.4.1. Sputn programu z IS  . . . . . . . . . . .  166
      4.4.2. Sputn programu z DOSu  . . . . . . . . . .  167
      4.4.3. Nalezen bhov chyby . . . . . . . . . . . .  167
   4.5. Ladn programu  . . . . . . . . . . . . . . . . .  169
      4.5.1. Debugger IS . . . . . . . . . . . . . . . . .  169
      4.5.2. Pkazy IS pro prci s debuggerem . . . . . .  172
      4.5.3. Ukonen ladn a reinicializace ladcho
             systmu . . . . . . . . . . . . . . . . . . .  174
      4.5.4. Sledovn hodnot promnnch a vraz  . . . .  175
      4.5.5. Modifikace hodnot promnnch  . . . . . . . .  183
      4.5.6. Prostedky pro ladn procedur a funkc . . .  185
      4.5.7. Pprava na ladn programu pomoc
             PURE Debuggeru . . . . . . . . . . . . . . .  186
   4.6. Prce s konfiguranmi soubory 187
      4.6.1.  PICK soubory . . . . . . . . . . . . . . . .  187
      4.6.2.  Konfiguran soubory . . . . . . . . . . . .  188
      4.6.3.  Automatick ukldn PICK soubor
              a konfiguranch soubor   . . . . . . . . .  189
   4.8. Programy uiten pi prci v IS . . . . . . . . .  190
      4.8.2.  PPUMOVER.PRG . . . . . . . . . . . . . . . .  193

5. Soubory . . . . . . . . . . . . . . . . . . . . . . . .  196
   5.1. Typy soubor . . . . . . . . . . . . . . . . . . .  196
      5.1.1.  Sekvenn soubory  . . . . . . . . . . . . .  196
      5.1.2.  Soubory s pmm pstupem . . . . . . . . .  198
      5.1.3.  Soubory zznam  . . . . . . . . . . . . . .  198
      5.1.4.  Textov soubory  . . . . . . . . . . . . . .  199
      5.1.5.  Primitivn soubory . . . . . . . . . . . . .  199
   5.2. Zkladn prce se soubory zznam  . . . . . . . .  199
      5.2.1.  Sekvenn soubory zznam  . . . . . . . . .  199
      5.2.2.  Soubory zznam s pmm pstupem . . . . .  202
   5.3. Zkladn prce s textovmi soubory . . . . . . . .  206
      5.3.1.  Oteven souboru . . . . . . . . . . . . . .  206
      5.3.2.  Struktura textovho souboru  . . . . . . . .  208
      5.3.3.  Zpis do textovho souboru . . . . . . . . .  212
      5.3.4.  ten z textovho souboru  . . . . . . . . .  215
      5.3.5.  Uzaven textovho souboru . . . . . . . . .  217
      5.3.6.  Standarn soubory Input a Output . . . . . .  217
      5.3.7.  Klvesnice jako textov soubor . . . . . . .  218
   5.4. Dal operace se soubory . . . . . . . . . . . . .  220
      5.4.1.  Smazn souboru  . . . . . . . . . . . . . .  220
      5.4.2.  Zmna aktivnho adrese . . . . . . . . . .  220
      5.4.3.  Zjitn volnho msta na disku  . . . . . .  221
      5.4.4.  Zjitn kapacity disku  . . . . . . . . . .  221
      5.4.5.  prava jmna souboru i adrese . . . . . .  221
      5.4.6.  Nalezen soubor na disku  . . . . . . . . .  221
      5.4.7.  Nalezen souboru v seznamu adres  . . . .  223
      5.4.8.  Rozdlen jmna souboru na sloky  . . . . .  224
      5.4.9.  Zjitn aktivnho adrese  . . . . . . . .  225
      5.4.10. Zjitn atribut souboru  . . . . . . . . .  225
      5.4.11. Zjitn data a asu posledn zmny v souboru 225
      5.4.12. Vytvoen adrese na disku  . . . . . . . .  226
      5.4.13. Pejmenovn souboru . . . . . . . . . . . .  226
      5.4.14. Zruen adrese na disku  . . . . . . . . .  226
      5.4.15. Nastaven atribut souboru . . . . . . . . .  226
      5.4.16. Nastaven data a asu posledn zmny
              v souboru  . . . . . . . . . . . . . . . . .  227
      5.4.17. Zkrcen souboru . . . . . . . . . . . . . .  227
   5.5. Oeten chyb vstupnch a vstupnch operac . . .  227
   5.6. Primitivn soubory a prce s buffery . . . . . . .  229
      5.6.1.  Buffery soubor  . . . . . . . . . . . . . .  229
      5.6.2.  Buffery textovch soubor  . . . . . . . . .  229
      5.6.3.  Primitivn soubory a buffery . . . . . . . .  230

A. ASCII tabulka . . . . . . . . . . . . . . . . . . . . .  236
B. Chybov hlen  . . . . . . . . . . . . . . . . . . .  240
   1. Chyby pi pekladu nebo pi prci s integrovanm
      systmem . . . . . . . . . . . . . . . . . . . . . .  240
   2. Bhov chyby . . . . . . . . . . . . . . . . . . . .  243
   3. Chyby pi Overlay  . . . . . . . . . . . . . . . . .  245
   4. Chyby v grafice  . . . . . . . . . . . . . . . . . .  246

Seznam pouit literatury  . . . . . . . . . . . . . . . .  247

Seznam peddefinovanch procedur a funkc  . . . . . . . .  249

Rejstk . . . . . . . . . . . . . . . . . . . . . . . . .  253

VOD

     Turbo Pascal je v souasn dob u ns nejpouvanjm
profesionlnm programovacm jazykem na osobnch potach. V
potaov vysplm svt je ji do jist mry vytlaen do
pozad jazykem C a hlavn uivatelsky orientovanm softwarem
(Oracle atp.). Pesto se domnvme, e se u ns bude jet
nkolik let pouvat (zatm m dl vc), a to s ohledem na:
-  Velkou rozenost mezi naimi programtory, a tedy i
   dostatek informac o nm a dostatek pascalskho softwaru.
-  Uivatelskou pitalivost zabudovanho integrovanho
   systmu.
-  Vuku Pascalu na naich stednch i vysokch kolch.

     Kniha je urena programtorm, a ji zanajcm nebo
pokroilm.
     Pedpokld, e ten ovld zkladn programovac techniky
a e um programovat v njakm jazyce, a ji je to Basic,
Pascal, Cobol, Fortran, nebo jin vy programovac jazyk. 
     Druhm, mn nutnm pedpokladem, je znalost operanho
systmu.


     Prce je urena nejirmu okruhu programtor, od
zanajcch, a po velmi pokroil.

     Skripta jsou lenna logicky do dvou dl. Prvn dl
(kapitola 1 a 5) je uren Pure Pascalskm zatenkm,
akoli jsou zde ji vechny daje probrny velmi podrobn a
mnoz pokroil uivatel se tu dovd nco novho. Druh dl
(kapitola 6 a 9) je vnovn pokroilm aplikacm, u nich je
pedpokldna jist minimln znalost operanho systmu.

     Prce obsahuje mnoho daj, kter nejsou uvedeny ani v
programov pruce Turbo Pascalu, spolu s adou doporuen k
jejich pouit. Prce obsahuje minimum jednoduchch pklad,
nebo tch je spousta na distribunch disketch Turbo Pascalu
a jejich opisovn by zbyten zvtilo rozsah i cenu prce.
Pesto tu pklady jsou. Tkaj se vtinou nestandardnch
programovacch technik a sna se ukzat (leckdy za cenu
obtnosti) jejich slu.

     Na konci kad kapitoly je uvedeno nkolik pklad a
cvien, kter Vm pomohou zopakovat si probranou ltku a
zamyslet se nad jejm obsahem.
Strun popime, co je obsahem jednotlivch kapitol:

I.dl
-  1.kapitola je vodem do integrovanho systmu a popisuje
   zkladn terminologii.
-  2.kapitola shrnuje vechny datov typy vetn jejich
   implementace, operac, funkc a procedur, kter se jich
   tkaj. Je urena zatenkm, ale i mrn pokroil se z
   n dovd leccos novho.
-  3.kapitola popisuje pkazy jazyka s podrobnm rozborem
   piazovacho pkazu a pouit uivatelskch procedur a
   funkc. Opt si v n pote zatenk i mrn pokroil.
-  4.kapitola je odpoinkov, nebo se zde nehovo o pkazech
   jazyka, ale popisuje se velmi podrobn cel Integrovan
   systm. Nejvce si zde asi potou ti, kte neradi nevd, k
   emu to i ono oknko v menu slou, a ji jde o
   zatenka nebo velmi zkuenho programtora.
-  5.kapitola diskutuje prci se soubory a adresi Dosu z
   Pascalu a je urena mrn pokroilm tenm.

II.dl
-  6.kapitola je vnovna Abstraktnm datovm strukturm.
   Popisuje se v n prce s dynamickmi promnnmi,
   netypovanmi promnnmi, prce se seznamy, stromy atd. V
   dal sti je vnovna nemal pozornost novmu prvku Turbo
   Pascalu 5.5 - objektm a pot unitm. Zbytek tto kapitoly
   diskutuje problematiku generovn nhodnch sel v Turbo
   Pascalu. Kapitola je urena pokroilejm programtorm,
   kte chtj vytvet rozshlej aplikace.
-  7.kapitola vyaduje jist znalosti o prci osobnho
   potae, nebo se zabv problematikou uloen dat,
   spoluprce s Dosem, voln slueb Dosu, tvorby rezidentnch
   program, spoluprce s assemblerem, spoutn proces,
   optimalizace pekladu atp. Je urena zkuenjm
   programtorm, kte chtj budovat rychl a kvalitn
   software.
-  8.kapitola pojednv o prci s periferiemi. Obsahuje
   zkladn soubor pkaz pro jejich ovldn, pomoc nho
   me i mrn pokroil Pure Pascalista vytvet pomrn
   pitaliv uivatelsk interface (barven obrazovky, window,
   atd.). Vedle toho tato kapitola navazuje na kapitolu sedmou
   a popisuje pouit nkterch slueb operanho systmu,
   kter vytvej ir prostor pro design Vaeho softwaru. Je
   to ale opt trochu obtnj.
-  9.kapitola popisuje prci s grafikou, a to od t
   nejjednodu rovn a po rove Dosu.

Dodatky
-    Dodatek A obsahuje ASCII tabulku s extended kdy.
-  Dodatek B obsahuje komentovan seznam chybovch hlen.
-  Dodatek C obsahuje odlinosti jednotlivch verz Turbo
   Pascalu a strun nvody, jak implementovat nkter prvky
   jinch programovacch jazyk. Tento dodatek je vhodn
   zejmna pro ty, kte mnoho let pracovali v jinm jazyce a
   maj pocit, e ten Turbo (Pure) Pascal vlastn nic neum.

    Jak ji vyplynulo z pehledu kapitol, prce se vnuje Turbo
Pascalu verzm 5.0 a 5.5, nebo je povaujeme za perspektivn.
Verze 5.5, vak dosud nen jet tak rozena, a proto vechny
pase vnujc se prvkm, kter jsou ve verzi 5.5 oproti verzi
5.0 navc, jsou vyznaeny svislou arou podl textu. Majitelm
verze 5.0 je doporuuji peskoit, aby nezvidli. 

     Kniha je dost obshl, a tak jsme si prci rozdlili na MFF
UK takto: Kapitoly 1, 4 a 8 sepsala Eva Novkov, kapitoly 2 a
9 Jana Vinov, kapitoly 3, 6 a 7 spolu s dodatky Tom Ruba,
na 5. kapitole pracoval Tom ehk z VCHT.



1. JAK ZAT

1.1. Podmnky pro prci v Turbo Pascalu verze 5.5

     Turbo Pascal verze 5.5 je strukturovan programovac jazyk 
opaten zkladnmi konstrukty pro modulrn a objektov
orientovan programovn. Krom nzvu programovacho jazyka
oznauje pojem Turbo Pascal verze 5.5 (krtce Turbo Pascal)
rozshl programov systm, kter umouje uit jazyka Turbo
Pascal pi psan program pro libovoln typy aplikac. 

     Turbo Pascal je produktem firmy Borland International. Je
uren pro potae kompatibiln s IBM PS/2, PC. Turbo Pascal
pracuje pod operanm systmem MeSs DOS, ppadn pod operanmi
systmy s nm kompatibilnmi. 

1.1.1. Minimln konfigurace potaovho systmu

     Za minimln konfiguraci potaovho systmu pro prci v
Pure Pascalu lze povaovat tuto sestavu:

     - 512 Kbyte operan pamti,
     - jedna disketov jednotka,

Chceme-li vak vyut vech monost, kter Pure Pascal
poskytuje, pak k nezbytnmu technickmu vybaven potae
pibude jet pevn disk.

     Dle poznamenejme, e Pure Pascal umouje prci v ST_MID, 
ST_HIGH a vych grafickch reimech.


1.1.2. Koprocesor 68 882

     Koprocesor je speciln numerick procesor, kter me
bt instalovn v potai. Koprocesor provd velmi rychle
numerick vpoty v pohybliv dov rce, umouje pouvat
krom typu real dal tyi typy sel s pohyblivou dovou
rkou (single, double, extended, comp), m se roziuje
rozsah hodnot sel s pohyblivou dovou rkou na interval 
3.4E-4932 .. 1.1E4932 (poet platnch slic je 19 a 20) a
zvyuje se pesnost vpot.

     Nen-li koprocesor v potai instalovn, nabz Pure
Pascal prostedky pro jeho emulaci, kter dovoluj vyuvat
vech monost, je koprocesor poskytuje. Chcete-li s
rozenmi relnmi typy pracovat, uvete na zatku programu
posloupnost  {$N+,$E+} .Podrobnj informace viz direktivy
kompiltoru. 

1.2. Instalace systmu

     Integrovan systm je systm softwarovch
prostedk, kter umouj vytvet, editovat, pekldat,
sestavovat, spoutt a ladit pascalsk programy.
Integrovan systm obsahuje krom rychlho pekladae a
sestavovacho programu vlastn obrazovkov editor podobn
editorm WordStar a SideKick, vestavn debugger umoujc
krokovn a trasovn program, sledovn a modifikaci hodnot
promnnch a vraz bhem vpotu a pouvn breakpoint. Pi
prci pod integrovanm systmem je uivatel veden soustavou
menu (nabdek), me pepnat mezi rznmi okny a kdykoliv
vyvolat help (npovdu) obsahujc informace o celm  systmu a
syntaxi programovacho jazyka vetn demonstranch pklad. 


1.3. Pklad peloen programu

     Je-li ji v okn "Edit" zobrazen njak text, provedeme
nejprve nsledujc operace:

-  stisknutm funkn klvesy  F10 se vrtme z editoru do
   hlavnho menu,
-  vybereme poloku "File" hlavnho menu (stisknutm F nebo
   pomoc ipek a klvesy Enter); zobraz se menu "File":

    File   Edit   Run   Compile   Options   Debug   Break/watch
  Ŀ Edit 
   Load      F3 
   Pick  Alt-F3 
   New          
   Save      F2 
   Write to     
   Directory    
   Change dir   
   OS shell     
   Quit   Alt-X 
  

-  z menu "File" vybereme poloku "New" (stisknutm N nebo
   pomoc ipek a klvesy Enter); integrovan systm nathne
   do editoru przdn soubor, kter je implicitn pojmenovn
   NONAME.PAS. Zmnu jmna vytvenho souboru lze provst
   pozdji, pi ukldn tohoto souboru na disk.


     Zapime nyn do okna "Edit" program podle vzoru uvedenho na
obrzku.

  File   Edit   Run   Compile   Options   Debug   Break/watch
 Edit ͸
 Line 12  Col 1  Insert Indent        Unindent  C:NONAME.PAS 
program Pozdrav;                                             
   var i:integer;                                            
   begin                                                     
      for i:= 1 to 5 do Writeln;                             
      Writeln('DOBRY DEN')                                   
                        {stednk je mysln vynechn}       
      Writeln('_________');                                  
      for i:= 1 to 5 do Writeln;                             
      Write ('Stisknete <Enter>...');                        
      Readln;                                                
   end.                                                      
   _                                                         
                                                             
                                                             
                                                             
 Watch Ĵ
                                                             

 F1-Help F5-Zoom F6-Switch F7-Trace F8-Step F9-Make F10-Menu



     Abychom program uloili do souboru na disk, je teba provst
tyto operace:

-  stisknutm funkn klvesy  F10 se vrtme z editoru do
   hlavnho menu,
-  z hlavnho menu vybereme poloku "File" (stisknutm F nebo
   pomoc ipek a klvesy Enter), zobraz se menu "File",
-  volbou poloky "Save" z menu "File" (stisknutm S nebo
   pomoc ipek a klvesy Enter)  vyvolme pkaz Save editoru;
   objev se nsledujc vstupn pole:

          Rename NONAME Ŀ
          C:\NONAME.PAS                            
         

   program, kter jsme vytvoili, se integrovan systm sna
   implicitn uloit do souboru NONAME.PAS. Chceme-li program
   uloit do souboru s jinm jmnem, zadme toto jmno do
   vstupnho pole. Pojmenujme soubor, do nho ulome n
   program, POZDRAV.PAS. (Sta, kdy napeme POZDRAV a
   odeleme, rozen .PAS bude doplnno automaticky). Program
   bude uloen do aktulnho adrese do souboru POZDRAV.PAS.

Pkaz Save lze vyvolat i rychleji, a to stisknutm funkn
klvesy F2 pmo v editoru.

1.3.3. Peklad a bh programu

     Peklad souboru zavedenho v editoru (v naem ppad jde o
soubor POZDRAV.PAS) vyvolme nsledovn:

-  stisknutm F10 aktivujeme hlavn menu,
-  vybereme poloku "Compile" hlavnho menu (stisknutm C nebo
   pomoc ipek a klvesy Enter); zobraz se menu "Compile":

  File   Edit   Run   Compile   Options   Debug   Break/watch
 Ŀ
                      Compile  Alt-F9                 
                      Make         F9                 
                      Build                           
                      Destination      Memory         
                      Find error                      
                      Primary file:                   
                      Get info                        
                     

-  volbou poloky "Compile" v menu "Compile" (stisknutm C nebo
   pomoc ipek a klvesy Enter) vyvolme peklad programu
   uloenho v editovanm souboru; v okn "Edit" se zobraz
   pole s informacemi o pekladu:

        Compiling to Memory ͻ
                                              
        Main file: POZDRAV.PAS                
        Compiling: EDITOR -> POZDRAV.PAS      
                                              
                           Total    File      
           Lines compiled: 10       10        
                                              
           Available memory:  186K            
                                              
                                              
                 Ctrl-Break to quit           
       ͼ


     Peklad programu lze vyvolat tak pmo z editoru souasnm
stisknutm klves Alt a F9.

     Pokud je v programu syntaktick chyba, peklada se zastav.
V prvnm dku okna "Edit" se objev chybov hlka a kurzor je
pesunut tsn za msto, na nm byla chyba nalezena.

     V naem ppad k chyb pi pekladu dojde, nebo za
pkazem  Writeln('DOBRY DEN')  chyb stednk. Obrazovka bude
tedy vypadat takto:


  File   Edit   Run   Compile   Options   Debug   Break/watch
 Edit ͸
Error 85: ";" expected                                       
program Pozdrav;                                             
   var i:integer;                                            
   begin                                                     
      for i:= 1 to 5 do Writeln;                             
      Writeln('DOBRY DEN')                                   
                        {stednk je mysln vynechn}       
     _Writeln('_________');                                  
      for i:= 1 to 5 do Writeln;                             
      Write ('Stisknete <Enter>...');                        
      Readln;                                                
   end.                                                      
                                                             
                                                             
                                                             
                                                             
 Watch Ĵ
                                                             

 F1-Help F5-Zoom F6-Switch F7-Trace F8-Step F9-Make F10-Menu


Po stisknut libovoln klvesy chybov hlka zmiz a chybu lze
opravit. Opraven program znovu pelome. Nyn je ji program
po syntaktick strnce v podku, proto je peklad spn
ukonen a v posledn dce pole s informacemi o pekladu blik
zprva  
               "  Success         :    Press any key  ". 
Stiskneme libovolnou klvesu a opravenou verzi programu ulome
pomoc klvesy F2 na disk do souboru POZDRAV.PAS. Pvodn obsah
souboru je pepsn, pedtm je vak vytvoena jeho zlon
kopie, kter je uloena do souboru POZDRAV.BAK.

     Nyn nm zbv program spustit. Bh programu vyvolme takto:

-  stisknutm F10 aktivujeme hlavn menu,
-  vybereme poloku "Run" hlavnho menu (stisknutm R nebo
   pomoc ipek a klvesy Enter); zobraz se menu "Run":


  File   Edit   Run   Compile   Options   Debug   Break/watch
Ŀ
                Run           Ctrl-F9 
                Program reset Ctrl-F2 
                Go to cursor       F4 
                Trace into         F7 
                Step over          F8 
                User screen    Alt-F5 
               

-  vbrem poloky "Run" z menu "Run" (stisknutm R nebo pomoc
   ipek a klvesy Enter) zpsobme bh programu nataenho v
   editoru (pokud nebyl program dosud peloen, je nejprve
   vyvoln jeho peklad).

Vstup programu je smrovn na tzv. uivatelskou obrazovku,
kterou lze po nvratu do integrovanho systmu opt vyvolat
volbou poloky "User screen" v menu "Run" nebo rychleji,
souasnm stisknutm klves Alt a F5. Z uivatelsk obrazovky
se zpt do integrovanho systmu vrtme po stisknut libovoln
klvesy.

     Peklad, uloen peloenho programu na disk a bh programu
lze vyvolat souasnm stisknutm klves Ctrl a F9 pmo v
editoru.

1.3.4. Zaveden existujcho souboru do editoru

     Existujc soubor zavedeme do editoru pkazem Load, kter
vyvolme vbrem poloky "Load" hlavnho menu nebo stisknutn
funkn klvesy F3. Po vyvoln pkazu Load se na obrazovce
objev vstupn pole:

         Load File Name Ŀ
         *.PAS                                    
        

     Stiskneme-li nyn klvesu Enter, je zobrazeno pole, v nm
je uveden seznam soubor s rozenm .PAS uloench v
aktulnm adresi a, pokud existuje, seznam podadres
aktulnho adrese (nzvy konc znakem \) a nadazen
adres (..\). Pomoc klves se ipkami lze v tomto seznamu
oznait libovoln soubor. Po stisknut klvesy Enter je pak
oznaen soubor zaveden do editoru a zobrazen v okn "Edit".
Ozname-li v seznamu nkter adres, je po stisknut klvesy
Enter zobrazeno podobn pole pro tento adres.

     Jestlie ze vstupnho pole odeleme vraz  *.* , je nabdnut
seznam vech soubor uloench v aktivnm adresi.

     Do vstupnho pole lze samozejm zadat rovnou jmno souboru,
nap.

         Load File Name Ŀ
         POZDRAV.BAK                              
        

 Pokud v aktulnm adresi existuje soubor s tmto jmnem, je
nataen do editoru a zobrazen v okn "Edit". Zadme-li do pole
jmno souboru, kter neexistuje, objev se przdn okno "Edit"
a editor nm umon tento soubor vytvoit.

1.3.5. Ukonen prce v integrovanm systmu

     Prci v integrovanm systmu ukonme vbrem poloky "Quit"
z menu "File" nebo souasnm stisknutm klves Alt a X.

1.4. Zkladn pojmy

     Dve ne se pustme do popisu jazyka Pure Pascal,
vysvtleme si nkolik zkladnch pojm.


1.4.1. Definice zkladnch pojm


      Program, pkaz, deklarace

     Programem nazvme posloupnost pkaz, poppad deklarac
a koment, popisujc uritou innost resp. urit vpoet.

     Pkaz je zpisem dl vpoetn akce. Rozliujeme pkazy
vkonn a pkazy dc. Vkonn pkazy jsou pkazy
piazen hodnoty promnn, pkazy skoku a pkazy voln
procedur. K dcm pkazm pat sloen pkaz, podmnn
pkazy      a pkazy cyklu. dc pkazy jsou pkazy
strukturovan, skldaj se z dlch vkonnch i dcch
pkaz a podmnek urujcch vtven i opakovn. dc
pkazy uruj zpsob provdn dlch pkaz, tj. zda budou
dl pkazy provdny postupn, podmnn i opakovan.

     Deklarace je zpis, kterm jsou v programu popsny a
pojmenovny datov typy, konstanty, promnn, nvt,
procedury     a funkce. Podle monosti pouit deklarovanch
typ, konstant, promnnch, procedur a funkc v programu
rozliujeme deklarace globln, vztahujc se na cel program,
a deklarace lokln, vztahujc se jen na uritou st
programu.

     Datov objekty, konstanty, promnn a typy dat

     K oznaen objekt, se ktermi pracuj procesy ve vpoetn
technice, se uv termnu datov objekty resp. data.

     Ve vych programovacch jazycch, k nim Pure Pascal
pat, lze pracovat s datovmi objekty rznch typ. Mezi bn
datov typy pat nap. typ celch sel, typ relnch sel,
typ znak a typ logickch hodnot, tzv. boolovsk typ.  Datov
typ, krtce typ, definuje obor hodnot, kterch me objekt
tohoto typu nabvat, a mnoinu operac, kter mohou bt nad
objekty tohoto typu provdny. Datov typ tedy uritm zpsobem
pslun objekt specifikuje a vymezuje jeho pouit.

     Vy programovac jazyky jsou jednak vybaveny standardnmi
datovmi typy a operacemi nad nimi, jednak poskytuj uivateli
monost vytvet sv vlastn datov typy. Nestandardn datov
typy se v programu zavdj deklaracemi typ. Deklarace typu
obsahuje popis typu a uruje jmno tohoto typu.

     Datov typy se podle charakteru hodnot, jich mohou objekty
tchto typ nabvat, dl na datov typy jednoduch a datov
typy strukturovan.

     Datov objekty jednoduchch typ nejsou nijak vnitn
strukturovny, obsahuj vdy pouze jedinou hodnotu, kter se z
hlediska ppustnch operac jev jako dle nedliteln
element. Mezi jednoduch datov typy pat vechny standardn
typy jazyka Pure Pascal (integer, real, character,
boolean,..), dle vtov typy, typy interval a typy ukazatel.

     Objekty strukturovanch datovch typ, krtce datov
struktury, vznikaj sdruenm datovch objekt jednoduchch i
jinch strukturovanch typ. Zkladnmi metodami strukturovn
dat jsou pole (array), zznam (record), mnoina (set) a soubor
(file).

     Pole je homogenn datov struktura, kter vznik sdruenm
uritho potu prvk tho typu. Vechny prvky pole jsou stejn
pstupn a odkazujeme se na n pomoc index.

     Zznam je datov struktura, kter vznik sdruenm poloek
rznch typ. Na poloky zznamu se odkazujeme pomoc jmen
tchto poloek.

     Mnoina je datov struktura definovan jako mnoina hodnot
tzv. bzovho typu. Termnem bzov typ oznaujeme jednoduch
datov typ, jeho objekty nabvaj hodnot z uritho omezenho
oboru.

     Soubor je datov struktura, kter popisuje posloupnost
hodnot objekt uritho typu spolu s aktuln pozic v tto
posloupnosti. Na rozdl od pole nen poet prvk souboru omezen
a v kadm okamiku vpoetnho procesu je pstupn pouze
jeden prvek souboru, a to ten, kter je uren aktuln pozic
v souboru.


     Datov objekty lze rozdlit do dvou zkladnch skupin, na
konstanty a promnn.

     Konstanta je datov objekt, jeho hodnota se v prbhu
vpotu nemn. Podle zpsobu oznaen konstanty v programu
rozliujeme dva druhy konstant, literly a pojmenovan
konstanty. Literlem je kad pm zpis hodnoty, nap.

                    -111                                       
               987.12306                                       
               "A"                                             
               True        false     .

Pojmenovan konstanty se oznauj jmny, tzv. identifiktory
konstant. Kad pojmenovan konstanta je v programu popsna
deklarac, v n je uren identifiktor tto konstanty a jej
hodnota.

     Promnn je datov objekt, kter me bhem vpotu nabvat
rznch hodnot. Promnn rozliujeme statick a dynamick.
     Statick promnn se oznauj jmny, tzv. identifiktory
promnnch. V programu se statick promnn zavdj
deklaracemi. Deklarace (statick) promnn uruje jmno
promnn a jej typ. Na zklad tto deklarace je pak promnn
reprezentovna v pamti potae a podle rozsahu hodnot, jich
me nabvat, je j vyhrazen v pamti prostor. Statick
promnn existuj po celou dobu provdn t jednotky programu,
v n jsou deklarovny.
     Dynamick promnn nevznikaj pi deklaraci, ale jsou
vytveny bhem vpotu po explicitnm vyvoln procedury pro
pidlen pamti. Tyto promnn nejsou oznaovny jmny, ale
odvolvme se na n nepmo, pomoc ukazatel. Existence
dynamick promnn je omezena okamikem vyvoln procedury pro
pidlen pamti tto promnn a okamikem vyvoln procedury
pro uvolnn pamti, je byla promnn pidlena.

     Podprogramy

     Podprogram je st programu, kter je oznaena jmnem a
popisuje  uritou dl akci, jej provdn  asto zvis na
mnoin parametr. Akci, kterou podprogram popisuje, lze v
programu kdykoliv vyvolat pomoc odkazu na jmno podprogramu. 

     Podprogramy vznikly jako een problmu opakovn uritch
posloupnost pkaz v programu a jsou zkladnm prostedkem
strukturovn program.

     Podprogramy se dl na procedury a funkce. Funkce je
specilnm typem procedury, jejm clem je vpoet urit
hodnoty. Na rozdl od voln procedury nen voln funkce
samostatn pkaz, ale oznauje jak proveden pslun akce
tak i vslednou hodnotu. Voln funkce je proto vdy soust
njakho vrazu.

     Unity

     Unita je skupina deklarac konstant, datovch typ,
promnnch, procedur a funkc, kter lze pouvat v libovolnm
programu, podprogramu i jin unit. 

     Unity jsou zkladnm prostedkem modulrnho programovn   
v Pure Pascalu. Zaveden unit umouje, aby byl program
rozdlen na sti, kter lze oddlen kompilovat, tzv.
separtn kompilaci. Typickm pkladem pouit unit je
vytven knihoven.

     Pure Pascal nabz uivateli velk poet peddefinovanch
konstant, datovch typ, promnnch, procedur a funkc, kter
jsou uiten pi programovn rznch typ loh, ale mlokdy
je teba, aby byly vechny pouity v jednom programu. Proto
jsou tyto peddefinovan konstanty, typy, promnn, procedury  
a funkce rozdleny do logickch skupin (knihoven), kterm se
k standardn unity Pure Pascalu. K programu pak lze
pipojit jen ty standardn unity, kter jsou nezbytn nutn.

     Pure Pascal poskytuje nsledujcch osm standardnch unit:
Dos, Overlay, Crt, Printer, Graph, System.

     Unita Dos definuje etn procedury a funkce, kter jsou
ekvivalentn nejastji uvanm pkazm operanho systmu   
DOS, a podprogramy, kter umouj pm vyvoln
libovolnho pkazu operanho systmu nebo systmovho
peruen.

     Unita Overlay poskytuje prostedky pro "overlay system".

     Unita Crt obsahuje skupinu deklarac podporujcch prci    
s textovou obrazovkou (pohyb kurzoru, nastaven barvy textu    
a pozad, vytven oken), s klvesnic a s reproduktorem.

     Unita Printer usnaduje prci s tiskrnou.

     Unita Graph poskytuje podprogramy pro prci s grafikou.

     Unita System obsahuje vechny procedury a funkce Pure
Pascalu, kter nejsou soust standardnho Pascalu a nejsou
obsaeny v dn jin standardn unit (tzv. run-time library).
Tato unita je vdy automaticky pilinkovna ke kadmu
programu.

1.4.2. Forma zpisu syntaxe jazyka

     Syntax jazyka (gramatika jazyka) je mnoina pravidel, kter 
definuj mnoinu sprvn vytvoench vt jazyka.

     Syntax jazyka Pure Pascal bude v textu popsna pomoc
pravidel tvaru

     <neterminl> ::=<posloupnost terminl, neterminl,
                      alternativ, nepovinnch st
                      a seznam>,

tzv. pepisovacch pravidel.

     Terminly jsou symboly resp. etzce symbol, kter se
vyskytuj v jazyce. Terminly jsou zapisovny vrazn (tj.
tunm psmem), nap. begin.

     Neterminly jsou symboly resp. etzce symbol, kter se
uvaj pi popisu jazyka, ale v jazyce se nevyskytuj. 
Neterminly jsou zapisovny ve piatch zvorkch, nap.     
<identifiktor>.

     Alternativa je zpis tvaru

                    - <volba 1>
                    - <volba 2>
                    - <volba 3>
                         .
                         .
                    - <volba N>  

resp. zpis tvaru

               <volba 1> | <volba 2> | <volba 3> | .. | <volba N> .

Tento zpis oznauje vbr z nkolika monch voleb. Jednotliv
volby se zapisuj pod sebe a jsou uvedeny znakem "-"  resp.
vedle sebe a jsou oddleny znakem "|".

     Nepovinn st je zpis tvaru

                            Ŀ
                     <nepovinn st>  ,
                            

kter vyjaduje, e jeho uveden v jazyce nen nutn.

     Seznam je zpis tvaru

                    <prvek seznamu> <oddlova> ... 

Tento zpis slou k oznaen neprzdnho seznamu prvk <prvek
seznamu> oddlench znakem <oddlova>.

1.4.3. Vyjadovac prostedky jazyka Pure Pascal 

     Kad jazyk je zaloen na njakm slovnku. U pirozench
jazyk se prvky slovnku jazyka nazvaj slova, v teorii
formlnch jazyk jsou prvky slovnku jazyka oznaovny pojmem
zkladn symboly. Vta jazyka je posloupnost zkladnch
symbol. Zkladn symboly jsou vytveny ze znak abecedy
jazyka.

     Abecedu jazyka Pure Pascal lze rozdlit do t disjunktnch
skupin: na psmena, slice a speciln symboly. Tyto skupiny
jsou definovny nsledovn:

     <psmeno> ::=   A | B | C | D | E | F | G | H | I | J | K |
                     L | M | N | O | P | Q | R | S | T | U | V |
                     W | X | Y | Z |
                     a | b | c | d | e | f | g | h | i | j | k |
                     l | m | n | o | p | q | r | s | t | u | v |
                     w | x | y | z 


     <slice> ::=   0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 


     <speciln symbol> ::=  + | - | / | * | = | < | > | $ |
                             ( | ) | [ | ] | { | } | ' | " |
                             ! | @ | # | % | & | ` | | | \ | ? |
                             ; | : | , | . |   | _ | ^ 

     Znak je potom mon definovat takto

     <znak> ::=   - <psmeno>
                  - <slice>
                  - <speciln symbol>
                - <jin symbol ASCII tabulky,
                   viz. ploha A>

     Mnoinu zkladnch symbol jazyka Pure Pascal tvo
vyhrazen slova jazyka, omezovae, identifiktory, slice     
  a hexadecimln slice.

     Vyhrazen slova jazyka Pure Pascal slou k vytven
konstrukt (vt) jazyka a jsou urena nsledujc definic:

     <vyhrazen slovo> ::=   absolute | and | array | begin |
                           case | const | constructor |
                           destructor | div | do | downto |
                           else | end | external | file | for |
                           forward | function | goto | if |
                           implementation | in | inline |
                           interface | interrupt | label | 
                           mod | nil | not | object | of | or |
                           packed | procedure | program |
                           record | repeat | set | shl | shr |
                           string | then | to | type | unit |
                           until | uses | var | virtual |
                           while | with | xor

s tm, e je ignorovn rozdl mezi malmi a velkmi psmeny,
tj. slova  var, Var, VAr, VAR, vAR, vaR, vAr a VaR  jsou
ekvivalentn.

     Termnem oddlovae jsou oznaovny aritmetick a relan
opertory, zvorky, mezera a nkolik dalch symbol potebnch
pro vytven konstrukc (vt) jazyka.

     <oddlovae> ::=  + | - | / | * |
                       = | < | > | <= | >= | <> |
                       ( | ) | [ | ] | { | } | (* | *) |
                     (. | .) |   |
                       ' | " | ^ | ; | : | , | . | := 

Poznamenejme, e oddlovae  (. a  [  resp.  .) a  ]  jsou
ekvivalentn.

     Identifiktory slou k pojmenovn datovch typ, konstant,
promnnch, procedur, funkc a unit. 

                                                     Ŀ
     <identifiktor> ::=  - <psmeno>   - <psmeno>      
                          -  _          - <slice>      
                                        -  _         ... 
                                                     

Identifiktory mohou mt libovolnou dlku a pro jejich
rozlien je vznamnch prvnch 63 znak. dn identifiktor
se nesm shodovat s vyhrazenm slovem. Stejn jako u
vyhrazench slov je i u identifiktor ignorovn rozdl mezi
malmi a velkmi psmeny.

     Poznmka: V popisu jazyka budeme asto kvli pehlednosti
slovo identifiktor zkracovat na id. a doplovat je o
pvlastek. Zpisy <id.typu>, <id.procedury> atd. jsou tedy
ekvivalentn zpisu <identifiktor> a je jich pouvno pro
zlepen itelnosti pepisovacch pravidel.
    sla a hexadecimln sla jsou definovna nsledovn:

     <slo> ::=  <slice>... 

     <hexadecimln slo> ::=  <hexadecimln slice>... 

     <hexadecimln slice> ::=  <slice> |
                                  A | B | C | D | E | F |
                                a | b | c | d | e | f 

1.4.4. Program

     Program zapsan v jazyce Pure Pascal je tvoen
nsledujcmi stmi:
     - hlavikou programu,
     - sekem deklarac, v nm je uveden seznam unit uvanch
programem a deklarace vech nvt, konstant, typ,
promnnch, procedur a funkc vyskytujcch se v programu,
     - pkazovou st obsahujc pkazy programu.

     Popis syntaxe programu:

     <program> ::=  
                                                     Ŀ  Ŀ
         program <id. programu>  ( <id. souboru> ,... )  ; 
                                                       
                                                    Ŀ
             uses  <identifiktor> , ... ;  <blok> .
                                               

piem
                         Ŀ                    Ŀ
     <blok> ::=  <deklarace>  begin  <pkaz> ;...  end
                                             

     Hlavika programu je pouze dekorativn st
turbopascalskho programu. Popisuje jmno programu a jeho
ppadn parametry.

     Klauzule uses obsahuje seznam jmen unit, kter program
pouv.

     Deklarace nvt, konstant, typ, promnnch, procedur a
funkc mohou bt v programu uvedeny v libovolnm poad.
Vechny datov typy, konstanty, promnn, nvt, procedury a
funkce, mus bt v programu deklarovny dve, ne v nm budou
pouity.

1.4.5. Komente

     Soust programu by mly bt komente. V Pure Pascalu
existuj dva typy koment:
     -    text uzaven v zvorkch   {  }  ,
     -    text uzaven v zvorkch  (*   *).

Pesnji: za koment je povaovn text, kter zan znakem {
a kon prvnm nsledujcm vskytem znaku }, nebo text, kter
zan dvojic znak (* a kon prvnm nsledujcm vskytem
dvojice znak *).

     Komente mohou bt v programu zapsny kdekoliv, kde me
bt uveden oddlova.

     Oba typy koment mohou obsahovat i nkolik dek textu.
Koment jednoho typu me bt obsaen v komenti druhho
typu. "Ken" koment je vak zakzno, tj. zpis typu

          {     (*     }     *)
resp.
          (*    {     *)      }

zpsob syntaktickou chybu.

     Komente je dobr pouvat alespo v tchto ppadech: 
-  za hlavikou programu, k popisu toho, co program dl, jak
   to dl, kdo je autorem programu atd.,
-  pi deklaraci promnnch k uveden vznamu promnnch v
   programu,
-  pi deklaraci procedur a funkc k popisu jejich innosti a
   zpsobu jejich pouit .

Pklad (tzv.komentov rmeek):

 {**************************************************}
 {                                                  }
 {  komentov rmeek lze pout nap. pro        }
 {  komentovn program, procedur a funkc         }
 {  za resp. ped jejich hlavikou                  }
 {                                                  }
 {**************************************************}
2. TYPY

2.1. vod

     V prvn kapitole jsme se mimo jin seznmili se zkladnmi
pojmy jako je deklarace, promnn, konstanta, typ. V tto
kapitole popeme deklarace konstant a promnnch a zejmna se
budeme podrobn vnovat typm.
     V nsledujcm textu nejprve poznme pojem typu, speciln
pak jednoduch typy, ordinln, dle strukturovan typy (pole,
zznamy, mnoiny, objekty) a soubory. Vklad zakonme pojmem
procedura a funkce jako promnn.

     Jak ji vme, blok zan deklaracemi, piem deklarace m
tvar:

     <deklarace> ::= - <deklarace konstant>
                               - <deklarace typ>
                               - <deklarace promnnch>      ...
                               - <deklarace podprogramu>
                               - <deklarace nvt>

     Deklarace podprogramu a nvt bude probrna ve 3.kapitole,
nyn podrobn popeme prvn ti typy deklarac.

2.1.1. Pojem typu

     Datov typy jsou stednm pojmem jazyka Pascal, protoe
vhodn definovan typy usnaduj psan programu a oven jeho
sprvnosti. Program s vhodnmi datovmi typy by ml bt dobe
iteln nejen pro autora programu.

     Typ promnn je mnoina hodnot, kterch me promnn
nabvat. K typu se vztahuj urit operace a funkce. S
charakteristikami typ (jako je zpsob uloen, metodika
pouit typu a dal), se seznmme v odstavci 2.1.5.

     Abychom mohli pracovat i s promnnmi sloitjch typ,
meme tyto typy deklarovat pedem a oznait si je
identifiktorem. Kdykoli se potom budeme chtt odvolat na
takovto typ, sta pout tohoto identifiktoru.

     Pro popis tchto typ je vylenna st deklarace, a to
deklarace typ. Syntaktick pravidla pro deklaraci typ:

     <deklarace typ> ::= type <deklarace typu> ...

     <deklarace typu> ::= <id. typu> = <oznaen typu> ;

     <oznaen typu> ::= - <popis typu>
                           - <identifiktor typu>

     <popis typu> ::= - <popis jednoduchho typu>
                              - <popis strukturovanho typu>

     Z popisu deklarace je vidt, e typ meme pmo definovat
identifiktorem peddefinovanho typu (nap, char, integer,...)
nebo identifiktorem dve deklarovanho typu. Druhou monost
je popis typu, jm se budeme podrobn zabvat v dalch
odstavcch.
     Pure Pascal obsahuje tyto peddefinovan typy:
byte, shortint, integer, word, longint, real, (resp. single,
double, extended, comp), boolean, char, pointer, string.

2.1.2. Deklarace promnnch

     Zaneme syntax:

     <deklarace promnnch> ::= var <deklarace promnn> ...

     <deklarace promnn> ::= 
                                        <id. promnn>,... : <oznaen typu> ;

     V tto definici m oznaen typu stejn vznam jako v
pedchzejcm odstavci. To znamen, e meme pout
identifiktor u existujcho typu (a u peddeklarovanho
nebo definovanho uivatelem) nebo typ specifikovat a v
deklaraci.
Napklad:

     type matice = array [1..10,1..3] of integer;
     {popis typu pojmenovanho matice (probereme pozdji)}
               .
          .
     var tabulka : matice;

Meme ale tak pmo napsat

     var tabulka : array [1..10,1..3] of integer;

     Deklarace promnnch jsou klovm prvkem deklaran sti.
Deklarac promnn "sdlujete potai":
     "Budu pouvat promnnou s tm a tm oznaenm, vyhra pro
ni potebn msto v pamti a jej hodnoty interpretuj podle
typu, kter jsem j piadil (psmeno, slo,...)." Z toho
plyne, e vechny promnn pouit v programu mus bt
deklarovny, pesnji deklarovny v deklaran sti bloku, v
nm se vyskytuj, nebo v blocch nadazench (viz 3.4.4).

Dvod pro pouvn identifiktor typ je cel ada:
-  Zlep se itelnost a pehlednost programu; to je markantn
   zejmna pi deklaracch sloitjch strukturovanch typ,
   kdy nemuste stle znovu pemlet, co kter typ znamen a
   ve vech deklaracch uvdte jenom identifiktor typu.
-  Opakovanm deklarovnm typu (msto deklarace matice budete
   stle opisovat array ...) se snadno udl chyba, kterou
   budete v rozshlm programu tko hledat.
-  Na zvr pdn argument: v hlavikch podprogram mus bt
   uvedeny identifiktory typ.

2.1.3. Deklarace konstant

     Pi programovn se asto dostanete do situace, kdy
potebujete promnnou nabvajc pouze jedn hodnoty. V takovm
ppad je vhodn deklarovat konstantu. Program pouvajc
konstanty se tak snadno aktualizuje - hodnotu konstanty
upravte pouze jednou, akoli se pouv vcekrt. Syntaxe:

     <deklarace konstant> ::= 

          const - <deklarace konstanty>           ...
                  - <deklarace typovan konstanty>

Prvn pklad, kdy deklarujeme konstantu, je asi celkem jasn,
nap.

     const max = 200;
               min = 0;
               znak = '*';
               alfa = chr(224);

V deklaraci nemusme uvdt vdy jen konstantu, meme tam
uvst vraz skldajc se opt z konstant nebo literl
(samozejm mus bt tyto konstanty dve deklarovan), nap.:

     const center = (max-min)/2;
               koef = 0.57875427E-2;
               c30 = 1/koef;

Pesn syntaxe deklarace konstanty je:

     <deklarace konstanty> ::= 

               <id. konstanty> = <konstantn vraz> ;

     <konstantn vraz> ::= 
          - <literl>
          - <id. konstanty>
          - <unrn opertor> <konstantn vraz>
          - <konstantn vraz> <binrn opertor> 
                                                       <konstantn vraz>
          - ( <konstantn vraz> )
          - <voln funkce>
          - <id. typu> ( <konstantn vraz> )
          - <konstanta typu mnoina>

     Konstantn vraz je vraz (viz 3.1.1), v nm se oproti
bnm vrazm nesm pout:
- Promnn nebo typovan konstanta.
- Voln funkc s vjimkou tchto:
     Abs    Chr   Hi      Length   Lo     Odd    Ord
     Pred   Ptr   Round   SizeOf   Succ   Swap   Trunc
- Opertor @.

     Tato omezen vyplvaj z toho, e konstanty se vyhodnocuj v
dob pekladu, kdy hodnoty promnnch a jejich absolutn adresy
nejsou znmy.

     Pm zpis hodnoty konstanty je mono provst zpisem
literlu, jeho forma je pro jednotliv typy rzn, a proto
podrobn vklad podme spolu s popisem pslunch typ. Na
tomto mst uvedeme pouze jejich pehled:

     <literl> ::= - <celoseln literl>
                           - <literl typu char>
                           - <literl typu real>
                           - <literl typu adresa>
                           - <literl typu string>

     U strukturovanch typ nelze v programu pout pmho
zpisu jejich hodnoty. Jedinou cestou je pouit typovanch
konstant.

     Krom konstant, kter si programtor sm definuje, existuj
v Pure Pascalu tak peddefinovan konstanty (maxint,
true,...). Probereme je, a se budeme zabvat jednotlivmi
datovmi typy.

     Vrame se vak k typovanm konstantm. Jak nzev napovd,
zce se vztahuj k datovm typm, a proto si typovan konstanty
podrobn vysvtlme a u pslunch typ. V tto chvli si
objasnme zkladn syntaktick pravidla:

     <deklarace typovan konstanty> ::= 
          <id. konstanty> : <id. typu> = <typovan konstanta> ;

     <typovan konstanta> ::= - <konstantn vraz>
                                              - <konstanta typu pole>
                                              - <konstanta typu zznam>
                                              - <konstanta typu mnoina>
                                              - <konstanta typu object>

     Typovan konstanty jsou na rozdl od normlnch konstant
vlastn promnn, nebo pi vpotu je mon mnit jejich
hodnotu, co u bnch konstant nelze (peklada hls chybu).

     Typovan konstanty jsou vyhodnoceny pi pekladu bez ohledu
na to, zda jsou deklarovny v podprogramu nebo v hlavnm
programu. Proto deklaraci konstant doporuujeme pst na zatku
programu, nebo jejich "lokalita", jak o n budeme hovoit v
3.4.4, je pinejmenm diskutabiln.

     Na rozdl od standardnho Pascalu mohou bt deklarace
promnnch, typ a konstant libovoln "promchny". V deklaraci 
vak mete pouvat pouze pojmy deklarovan ped touto
deklarac (deklarace jsou uspodan sekvenn). Vjimkou je
typ ukazatel (jak pozdji uvidme v 2.2.6). Napklad nelze:

     const max=200;
               suma=max+min;
               min=0;

     Pestoe nen poad jednotlivch deklarac pevn stanoveno,
je vhodn zachovvat uritou hierarchii - doporuujeme
dodrovat poad

          const ...
          type  ...
          var   ...
          podprogramy

     Komente popisujc vznam jednotlivch promnnch, typ a
konstant vele doporuujeme. Odstraujc pklad:

     type matice = array[1..10,1..3] of integer;
     var i,j : integer;
     var m : matice;k : integer;
     type pole = array[1..10] of integer;
     var p : pole;
           q : array[1..10] of integer;

Tak by deklarace jist vypadat nemly, zejmna je zbyten v
deklaraci vypisovat typ, kter je u na jinm mst deklarovn.
Lpe nap.:

     type matice = array[1..10,1..3] of integer;
            pole = array[1..10] of integer;
     var m : matice;         { tabulka kritickch hodnot } 
           p,q : pole;         { pracovn pole mezivsledk }
           i,j,k : integer;    { pomocn promnn }

2.1.4. Omezen

     V pedchozm vkladu jsme se vnovali deklaracm typ,
promnnch a konstant. Pro vechny deklarace plat nkolik
omezen:

-  Deklarace mus bt jednoznan v rmci bloku. To znamen, e 
   nelze deklarovat teba dva typy se stejnm jmnem v
   deklaraci v programu, ale meme deklarovat typ se stejnm
   identifiktorem v procedue (nedoporuujeme!), nap.:

     program MujPgm;
     type aa = array[1..3] of real;
     procedure Tisk;
     type aa = byte;
     begin ... end;
     ...

-  V deklaracch meme uvat pouze u dve deklarovan
   pojmy, vjimkou je typ ukazatel.
-  U jsme upozorovali (a jet budeme) na iteln
   programovn - k tomu pat mnemotechnick identifiktory,
   podek v deklaracch, zavdn identifiktor typ, ...
-  Pozor na nemysln pouit identifiktoru nkter standardn
   procedury nebo funkce jako identifiktoru promnn nebo
   podprogramu - nen to chyba, ale je to matouc, nebo
   pvodn vznam identifiktoru je nepstupn.

2.1.5. Co se ve k typu

     V ptch odstavcch probereme podrobn jednotliv datov
typy. Zaneme jednoduchmi a ordinlnmi typy, pak pejdeme k
sloitjm strukturovanm typm a typu soubor. Pi vkladu se
budeme v podstat dret tto zkladn osnovy:

-  nzev typu
-  syntaktick pravidla pro typy zadvan popisem
-  rozsah hodnot
-  zpsob uloen promnnch danho typu v potai
-  opertory vztahujc se k danmu typu a jejich strun
   popis, protoe detailn popis opertor je v nsledujc
   kapitole (viz 3.1.1)
-  konstanty peddeklarovan pro dan typ, typovan konstanty
-  literly danho typu
-  pstup ke slokm typu, tento bod se tk samozejm
   strukturovanch typ a typu soubor
-  standardn funkce a procedury, jejich seznam a popis
   innosti (pokud to nen pedmtem jin kapitoly)
-  strun metodika pouit a ilustrujc pklad

2.2. Jednoduch typy

     Jednoduch typy jsou takov typy, kter nelze rozdlit na
sloky. Obor hodnot jednoduchch typ je vdy
jednodimenzionln, tj. promnn takovchto typ obsahuj
skalrn veliinu (slo, psmeno,...).
     Jednoduch typy dlme na ordinln typy, reln sla,
etzce a typ ukazatel. Ordinln typy meme dle rozlenit na
typ interval, vtov typ, celoseln typy, typ char a typ
boolean. Schematick znzornn:

   Ŀ  Ŀ Ŀ
      JEDNODUCH TYPY   ´   ORDINLN  ´   INTERVAL  
    ٳ
                                           Ŀ
                                           ô   VTOV   
                                           
                                           Ŀ
                                           ô CELOSELN 
                                           
                                           Ŀ
                                           ô    CHAR     
                                           
                                           Ŀ
                                              BOOLEAN   
                                            
                           Ŀ
                           ô   RELN SLA  
                           
                           Ŀ
                           ô   ETZCE   
                           
                           Ŀ
                              UKAZATELE  
                            
Syntaxe:

     <popis jednoduchho typu> ::= - <popis ordinlnho typu>
                                                     - <popis typu etzec>
                                                     - <popis typu ukazatel>

     Toto lenn vychz z toho, e promnnou jednoduchho typu
meme zskat jako vsledek funkce (m se vrazn li od
strukturovanch typ), proto sem pat tak typ etzec a
ukazatele (viz 3.4.3).

     V nsledujcch odstavcch probereme celoseln typy, typy
pro reln sla, typ boolean, typ char, typ etzec a
ukazatele. Vtov typ a typ interval budou vysvtleny zvl v
odstavci 2.3.

2.2.1. Celoseln typy

     Celoseln typy reprezentuj cel sla. Jsou to tedy
uspodan mnoiny hodnot v rznch rozsazch. Nzev, rozsah
hodnot (nejmen a nejvt ppustnou hodnotu) a zpsob
uloen uvdme v tabulce:
        
      ͻ
        NZEV            ROZSAH                ULOEN    
      ͹
       shortint         -128..127          8 bit se znam.
      Ķ
       integer        -32768..32767       16 bit se znam.
      Ķ
       longint    -214748348..2147483647  32 bit se znam.
      Ķ
       byte                0..255              8 bit     
      Ķ
       word                0..65535           16 bit     
      ͼ

     Pehled opertor pro celoseln typy (poznamenejme, e
dkladn popis prce opertor pro vechny typy je obsaen v 
odstavci 3.1.1):
- opertory stn  + - stn 
                                   - - odtn
                                   or -logick alternativa na bitov
                           reprezentaci
                                   xor - nonekvivalence na bitov
reprezentaci
- unrn opertory   +,- - opertory urujc znamnko operandu
- opertory nsoben * - nsoben
                                   div - celoseln dlen
                                   mod - zbytek po dlen
                                   shl,shr - posun bitov reprezentace o
                                                   zadan poet bit doleva resp.
                                                   doprava
                                   and - logick konjunkce bitovch repre
zentac operand
- relan opertory <,>,<=,>=,=,<>

     Peddeklarovan konstanty jsou dv:
          maxint=32767
          maxlongint=2147483647
    Syntaxe deklarace celoselnch literl:

          <celoseln literl> ::= 
                Ŀ
         -  +  -  <slo>
                
                Ŀ  
         -  +  -   $ <hexadecimln slo>
                  

Symbol $ slou k zpisu hexadecimlnch konstant.

     U netypovan konstanty se typ ur tak, e to je "nejmen"
typ, kter danou konstantu obsahuje. Slovo "nejmen" chpejte
ve smylu uspodn shortint, byte, integer, word, longint.
Konstantu vt ne maxlongint muste zadat jako reln slo s
desetinnou tekou (viz 2.2.2).
     Typovan konstanty u umme vytvet. Mete se s nimi tak
setkat jako s peddefinovanmi konstantami systmu (nap. v
unit System).

     Standardn funkce pro celoseln typy (poznamenejme, e
<CisTyp> je libovoln celoseln typ):

Ŀ
    function Abs ( x : <CisTyp> ) : <CisTyp>;               


Funkce Abs vrac absolutn hodnotu sla x, piem vsledek je
stejnho typu jako argument funkce.

Ŀ
    function Odd ( x : <CisTyp> ) : boolean;                


Vsledkem funkce Odd je true, pokud je x lich slo, false pro
sud slo (viz 2.2.3).

Ŀ
    function Sqr ( x : <CisTyp> ) : <CisTyp>;               


Funkce Sqr vrac druhou mocninu sla x. Pro nkter hodnoty x
me dojt k peteen (viz 3.1.1). Pi nastaven volby Range
check error na Off, nen hlena dn chyba. Pi nastaven On
je hlena chyba 201 u typ shortint(11), byte(15), word(255);
v zvorce jsou uvedeny posledn "bezpen hodnoty", pro vt
sla dojde k chyb. U typu integer(181) a longint(201995) 
chyba nen hlena, pestoe hodnota "petee".

Ŀ
    function Hi ( x : <CTyp> ) : byte;                      


Vsledkem funkce je horn byte promnn x, jej typ <CTyp> je
bu integer nebo word.

Ŀ
    function Lo ( x : <CTyp> ) : byte;                      


Podobn jako pedchoz funkce vrac doln byte promnn x.

Ŀ
    function Swap ( x : <CTyp> ) : <CTyp>;                  


Pehod doln a horn byte promnn x. Funkce Hi, Lo a Swap
budeme ilustrovat na pklad:

     var x : integer;
           y : byte;
     ... x:=1;
           y:=Hi(x);               { y=0 }
           y:=Lo(x);               { y=1 }
           y:=Swap(x);...     { y=256 }

Podobn pro x=$1234 dostaneme postupn y=18,52,13330, co je
$12,$34,$3412.

     Celoseln typy jsou v programech velmi frekventovan.
Pouvaj se pro dc promnn cykl, tae, apod. Pt typ
umouje vbr vhodnho typu z hlediska rozsahu hodnot. Pi
vbru typu je sprvn volit "men" typy (pokud sta typ
word, je zbyten volit typ longint), zvyuje se tm bezpenost
programu. Pokud pracujete pouze s pirozenmi sly, dvejte
opt z dvodu bezpenosti pednost typm byte a word ped
shortint a integer. Dal omezen rozsahu umouje typ interval
- viz odstavec 2.3.2.

2.2.2. Reln sla

     Pure Pascal 5.0 poskytuje pt typ pro reprezentaci
relnch sel. Tyto typy se li rozsahem hodnot, pesnost a
zpsobem uloen v potai, jejich pouit je vak zce spjato
s existenc matematickho koprocesoru na Vaem potai. 
     Typ real je univerzln, tm myslme, e reprezentuje reln
sla bez ohledu na to, zda pouvte koprocesor. Dal tyi
typy mete pouvat, pokud zadte direktivu {$N+,E+}, m se
provede softwarov emulace operac koprocesoru nad uvedenmi
typy, nebo pokud je pmo vyuvn koprocesor, je-li
instalovn.

      Reln typy pedstavuj uspodanou mnoinu racionlnch
sel. Omezen vyplv nejen z rozsahu hodnot, ale tak z
reprezentace relnho sla v pohybliv dov rce s omezenm
potem mst. 
     Jednotliv typy shrneme v nsledujc tabulce, kde je uveden
nzev typu, rozsah absolutnch hodnot, poet platnch mst a
velikost v bytech:

ͻ
 NZEV           ROZSAH      POET MST  VELIKOST 
͹
 real     2.9E-39  ..1.7E38    11 - 12    6 byt  
Ķ
 single   1.5E-45  ..3.4E38     7 -  8    4 byty  
Ķ
 double   5.0E-324 ..1.7E308   15 - 16    8 byt  
Ķ
 extended 3.4E-4932..1.1E4932  19 - 20   10 byt  
Ķ
 comp     -9.2E18  ..9.2E18    19 - 20    8 byt  
ͼ

     Zpis nap. 2.9E-39 znamen nsoben sla 2.9 pslunou
mocninou 10. Posledn jmenovan typ comp slou pro uloen
celoselnch hodnot v rozsahu -2**63+1..2**63-1 (hvzdiky
oznauj umocnn), co piblin odpovd hodnotm v tabulce.

     Jet musme uvst syntaktick pravidla pro zpis literl
typu real:

     <literl typu real> ::= 
         Ŀ                 Ŀ       Ŀ         Ŀ
       +-  <slo>  .<slo>  Ee  +-   <slo> 
                                          

Je tedy vidt, e zpis .5 je neppustn. sla bez
desetinnho rozvoje nebo exponentu jsou chpna jako cel, a
proto se na n vztahuj pslun omezen rozsahu.

     Jet ne pejdeme k form uloen, musme upozornit na to,
e v binrn reprezentaci relnch sel typ single, double a
extended jsou nkter kombinace neppustn. V dalm textu to
oznaujeme symboly Inf a NaN, oba symboly pedstavuj konkrtn
obsahy bitovch reprezentac.
     Strun vlastnosti:
-  Inf a NaN nejsou identifiktory, nememe se na n v
   programu odvolat; meme je detekovat pi ladn nebo v
   procedurch write, writeln, str.
-  Promnn ve stavu Inf ani NaN nemohou bt argumentem nkter
   standardn funkce, zpsob to bhovou chybu 207 (Invalid
   floating point operation). Nemohou se vyskytnout ani ve
   vrazu: NaN zpsob chybu 207, operace s Inf jsou
   nedefinovny (nap. "Inf+1=Inf").
-  Pi ladn programu se zobrazuje (nap. v oknku watch
   integrovanho systmu) pro oba ppady hodnota promnn
   0.0E32766 (me bt s minusem pro Inf).
-  Pi vpisu promnnch na obrazovku procedurou writeln nebo
   write se zobraz texty 'INF' nebo 'NAN'.

     Zpsob uloen promnn kadho typu znzornme graficky,
tj. bity pro znamnko, mantisu a exponent, HB oznauje
nejvznamnj bit, DB nejmn vznamn bit. Uvedeme vzorec pro
vpoet
                                                               s
hodnoty v relnho sla, v nm zpis (-1)  * 0 znamen, e se
eventuln zobrazuje 0 se znamnkem minus:

     typ REAL - 6 byt (48 bit) je rozdleno takto

 1            39            8
Ŀ
s           f            e   

   HB                 DB HB   DB

                                     s    (e-129)
     0<e<=255, pak v=(-1)  * 2       * (1.f)
     e=0     , pak v=0

     typ SINGLE - 4 byty (32 bit):

 1    8          23
Ŀ
s   e         f      

   HB   DB HB         DB

                                    s    (e-127)
     0<e<255, pak v=(-1)  * 2       * (1.f)

                                                   s    -126
     (e=0) and (f<>0), pak v=(-1)  * 2    * (0.f)

                                                   s
     (e=0) and (f=0) , pak v=(-1)  * 0

                                                    s
     (e=255) and (f=0), pak v=(-1)  * Inf

     (e=255) and (f<>0), pak v=NaN

     typ DOUBLE - 8 byt (64 bit):

 1      11                  52
Ŀ
s     e                  f           

   HB       DB HB                     DB

                                     s    (e-1023)
     0<e<2047, pak v=(-1)  * 2        * (1.f)

                                                   s    -1022
     (e=0) and (f<>0), pak v=(-1)  * 2     * (0.f)

                                                  s
     (e=0) and (f=0), pak v=(-1)  * 0

                                                     s
     (e=2047) and (f=0), pak v=(-1)  * Inf


     (e=2047) and (f<>0), pak v=NaN

     typ EXTENDED - 10 byt (80 bit):

 1       15      1                 63
Ŀ
s      e      i                f                

   HB         DB   HB                             DB 

                                        s    (e-16383)
     0=<e<32767, pak v=(-1)  * 2         * (i.f)

                                          s
     e=0 and f=0, pak v=(-1)  * 0

                                                      s
     (e=32767) and (f=0), pak v=(-1)  * Inf

     (e=32767) and (f<>0), pak v=NaN

     typ COMP - 8 byt (64 bit):

 1                   63
Ŀ
s                  d                  

   HB                                 DB 

     uloeno jako cel slo,
     v ppad (s=1) and (d=0) dojde k chyb,

     Pehled opertor pro reln typy:
- opertory stn  + - stn
                                   - - odtn
- unrn opertory   +,- - opertory urujc znamnko operandu
- opertory nsoben * - nsoben
                                   / - dlen
- relan opertory <,>,<=,>=,=,<>

     Typovan konstanty se vytvej podle uvedench pravidel,
hodnoty se zadvaj v rozsahu zvolenho typu. Nkolik pklad:
     const max : real = 12345212312E20;
               maxext : extended = 12345212312E40;
ale nelze (vede k chyb 76 Constant out of range)
     const max : real = 12345421312E40;

     Pi deklaraci celoseln konstanty vt ne maxlongint se
mus hodnota vypsat jako reln slo, nap.

     const max=12345678912.0;

     V reimu {$N-} je u vech uvedench funkc vsledek typu
real, v reimu {$N+,E+} je vsledek typu extended (srovnej
3.1.1).
     Pro reln typy jsou definovny tyto standardn funkce:

Ŀ
    function Abs ( x : real ) : real;                       


     Vrac absolutn hodnotu sla x.

Ŀ
    function Arctan ( x : real ) : real;                    


     Funkce vrac arctangens sla x, vsledek je v radinech.

Ŀ
    function Cos ( x : real ) : real;                       


     Vsledkem funkce je cosinus sla x (v radinech).

Ŀ
    function Exp ( x : real ) : real;                       


     Vsledkem funkce je hodnota e umocnn na x (Eulerova
konstanta - zklad pirozench logaritm,
e=2.7182818284590...). 

Ŀ
    function Frac ( x : real ) : real;                      


     Funkce vrac desetinnou st argumentu funkce. Plat
nsledujc vztah: Frac(x)=x-Int(x).

Ŀ
    function Int ( x : real ) : real;                       


     Vsledkem je cel st sla x a je prezentovna jako reln
slo, m se li od funkce Trunc.

Ŀ
    function Ln ( x : real ) : real;                        


     Vsledkem funkce je pirozen logaritmus sla x.

Ŀ
    function Pi;                                            


     Funkce vrac Ludolfovo slo  (=3.1415926535897932385)  s
pesnost odpovdajc nastaven pepnae {$N}.

Ŀ
    function Sin ( x : real ) : real;                       


     Vsledkem funkce je sinus sla x (v radinech).

Ŀ
    function Sqr ( x : real ) : real;                       


     Vsledkem je druh mocnina sla x.

Ŀ
    function Sqrt ( x : real ) : real;                      


     Funkce vrac druhou odmocninu argumentu funkce.

     Krom toho existuj jet dv funkce pro zaokrouhlovn
relnch sel:

Ŀ
    function Round ( x : real ) : longint;                  


     Argumentem funkce je reln slo, kter bude zaokrouhleno
na nejbli cel slo. Je-li x vt ne rozsah typu longint,
pi voln funkce vznikne bhov chyba (nap. 76 Constant Out
of Range). Nap.

     var pom : longint; ...
          pom:=round(5.12131);                         { pom = 5 }
          pom:=round(5.8); ...                    { pom = 6 }

Funkce round se pouv nejen k zaokrouhlovn, ale tak k
pevodu relnho sla na celoseln typ.

Ŀ
    function Trunc ( x : real ) : longint;                  


     Funkce provede zaokrouhlen relnho sla na doln celou
st, jinak plat tot co pro round, pklad:

          pom:=trunc(5.12131);                         { pom = 5 }
          pom:=trunc(5.8);                             { pom = 5 }

Vimnte si, e funkce Int dv stejn vsledek jako Trunc, ale
jinho typu.

     Vbr typu relnch sel zvis na monostech Vaeho
potae (koprocesor, AT, XT) a na loze, kterou budete eit -
 dan pesnost, rozsah ppustnch hodnot a v neposledn ad
tak nroky na msto a rychlost vpotu.
     Poznamenejme, e pi prci s koprocesorem (nebo softwarovou
emulac) se vechny vpoty provdj pro typ extended a teprve
pi ukldn do promnnch se hodnota pizpsob typu.
     Pesnost vpotu je nejlpe vidt pi tisku relnch
promnnch bez formtovn (viz 3.3). Nap.:

          var x,y : real;
          begin 
               read(x,y);
               write(x*y);
          end;

Pokud nepracujeme v reimu {$N+}, je vsledek zobrazen na 11
platnch mst (pesnost uloen je 55-krt vt). Pracujeme-li
v reimu {$N+}, je vsledek zobrazen na 18 platnch mst
(pesnost uloen je 92234-krt vt).
     Zven pesnost typu extended je "vykoupena" tm
dvojnsobnm rozsahem v pamti a zpomalenm vech operac,
zejmna jsou-li pouze emulovny. To je teba zvit pi prci s
velkmi strukturami.

2.2.3. Typ boolean

     V Pascalu existuje logick typ boolean. Promnn typu
boolean nabv pouze hodnot true (pravda) a false (nepravda),
co jsou zrove konstanty tohoto typu. 

     Hodnoty typu boolean jsou uloeny jako 0 (false) a 1 (true)
ve form bytu bez znamnka.

     Hodnoty typu boolean jsou uspodan:
          false < true

a lze pro n ut tyto opertory:
- logick opertory  not - negace 
                                   and - konjunkce
                                   or  - disjunkce
                                   xor - nonekvivalence
- relan opertory <,>,<=,>=,=,<>.

     Standardn funkce jsou stejn jako pro ordinln typy (jak
se dovme v odstavci 2.3.3), protoe typ boolean pat mezi
ordinln typy. Jsou to funkce Ord, Succ, Pred. Vzhledem k
tomu, e typ boolean pipout jen dv hodnoty, funkce se
pli nepouvaj, a proto si uvedeme jen vsledky:
     Ord(false)=0
     Ord(true)=1
     Succ(false)=true
     Pred(true)=false
Jin monosti pro pouit funkc nen, pokud zadte nap.
     Succ(true)
ohls se chyba.

     Promnn typu boolean se pouvaj pi vyhodnocovn
logickch vraz (jak ostatn napovd peklad z anglitiny
true = pravda, false = nepravda), dle se pouvaj jako dc
promnn cykl (vsledek logick podmnky se ulo do promnn
typu boolean, nap. 

     konec:=false;
     repeat ... until konec;).

2.2.4. Typ char

     Znaky jsou v Pascalu reprezentovny typem char. Znaky
rozumme uspodanou mnoinu ASCII znak tak, jak jsou uvedeny
v tabulce v ploze A (pat tam tedy velk a mal psmena,
nkter znaky eck abecedy, nkter znaky nrodnch abeced,
slice a speciln znaky). Znaky jsou oslovny podle ASCII
tabulky sly od 0 do 255, tomuto oslovn kme ordinalita
znak. Typ char je tedy tak ordinlnm typem.

     Hodnoty typu char jsou uloeny podle svch ordinalit jako
byte bez znamnka, rozsah hodnot je od 0 do 255.

     Pro znaky jsou definovny relan opertory <,>,<=,>=,=,<>.

     Jako konstanty vystupuj pslun znaky zapsan v
apostrofech nebo pomoc symbolu #. Znak pomoc # zapeme tak,
e po # uvedeme ordinalitu tohoto znaku. Syntaxe vypad takto:

     <literl typu char> ::= - ' <znak> '
                                             - # <slo>

kde slo je mezi 0 a 255, nap.

     const Spec = '$';
               Dolar = #36;

Obdobn se tvo typovan konstanty:

     const Min : char = 'A';
               Max : char = 'Z';
               Apostrof : char = ''''

     Poznamenejme, e znak apostrof nememe napsat do dvou
apostrof, ale musme jej zdvojit, jak je to vidt v pedchozm
pkladu.

     Krom standardnch funkc pro ordinln typy Succ, Pred,
Ord, je pro typ char definovna tak funkce Chr.

Ŀ
    function Chr ( x : byte ) : char;                       
 

     Vstupn hodnotou funkce by mlo bt slo typu byte (tedy
mezi 0 a 255), vstupem je znak s odpovdajc ordinalitou
podle ASCII tabulky. Argumentem funkce vak me bt i slo
typu longint, zobraz se znak s ordinalitou x mod 256.
     Tato funkce se odliuje od #, protoe za symbolem # me bt
jen slo, zatmco v argumentu funkce chr i vraz. Chr se
vyhodnocuje pi bhu programu, # pi pekladu.

Ŀ
    function UpCase ( ch : char ) : char;                   


     Funkce konvertuje mal psmena na velk. Pokud ch nen mal
psmeno, ponech ch beze zmn.

2.2.5. etzce

     Pro vyjden znakovch etzc slou typ string. Dlka
etzce (poet znak obsaench v etzci) me bt v mezch 1
a 255. Maximln dlka etzce se me explicitn uvst v
deklaraci typu string, jak je vidt z nsledujcho
syntaktickho zpisu:

                                                       Ŀ
   <popis typu etzec> ::= string  [<konstantn vraz>] 
                                                       

V ppad, e neuvedete velikost, pokld se velikost
implicitn rovna 255. Pklady:

     var a : string;          {velikost a je maximln 255}
           b : string[25];    {velikost b je maximln 25 znak}

Jet poznamenejme, e v etzci typu string[25] me bt teba
jen jedin znak, ale nepoda se Vm uloit do tohoto etzce
vc znak ne 25. Mete tak pouvat przdn etzec, to je
etzec, kter neobsahuje dn znak (dlky 0), zapisuje se
jako dva apostrofy za sebou ''.

     etzec je uloen jako posloupnost znak, piem nejprve je
v prvnm bytu uvedena dlka etzce (kolik znak skuten
etzec obsahuje), v dalch bytech jsou uloeny jednotliv
znaky. V odstavci 2.4.1 se budeme zabvat strukturovanm typem
pole a vysvtlme si rozdl mezi typem string a znakovm
etzcem.

     Opertory pro typ string:
- opertor stn + je spojen etzc
- relan opertory <,>,<=,>=,=,<>.

     Konstanty (i typovan) tvome znmm zpsobem, zde je
syntaxe pro literl typu string:

     <literl typu string> ::= '<znak>...'

Uveme nkolik pklad:

     const school = 'MFF UK';
               zkratka : string = 'P.O. Box';
               dist : string[25] = 'DISTRIBUTION';

     Tak v literlech typu string se me vyskytnout apostrof.
Zapeme to opt zdvojenm apostrof (m-li tedy v textu bt
jeden apostrof, v literlu napeme dva apostrofy). Nkolik
pklad:

     const prvni = '*''A''*';  {uloili jsme etzec *'A'*}
               druha = '''A''';    {   "            "      'A'}
               treti = '''''A''''';{   "            "    ''A''}

     U typu string se poprv setkvme s pstupem ke slokm
typu. U jsme naznaili, e je velmi pbuzn s typem pole.
Tak pstup k jednotlivm znakm v etzci je podobn,
syntaktick zpis:

     <element etzce> ::= <id. etzce>[<celoseln vraz>]

Nkolik pklad:

     var s1 : string;
           s2 : string[5];
     begin ... s2:=s1[255];...s2:=s1[50]; ... end;
ale nelze
                    s1:=s2[6];

Zpis s1[0] m smysl, protoe na "nult " pozici v etzci je
znak odpovdajc dlce etzce (viz uloen v potai). Dlku
etzce (nap. s1) meme urit takto:
     Ord(s1[0])
Tento zpsob pouijte pouze z vnch dvod, mnohem lep je
pout funkci Length, kter tak ur dlku etzce, ale zpis
je mnohem pehlednj.

     Nyn pejdeme ke standardnm funkcm:

Ŀ
    function Length ( s : string ) : integer;               


     Tato funkce uruje dlku etzce s. Samozejm Length(s) =
Ord(s[0]).

Ŀ
    function Concat ( s ,... : string ) : string;           


     Funkce Concat provede spojen etzc v uvedenm poad.
Pokud by rozsah vslednho etzce pekroil 255 znak,
pebvajc znaky se neulo. 
     Stejnho vsledku doshnete pouitm opertoru +.

Pklad: var s : string;
               ... s:='ABE'+'CEDA';
tot dostanete zmnnou funkc
                     s:=Concat('ABE','CEDA');

Ŀ
  function Copy(s:string;Ind:integer;Count:integer):string; 


     Funkce vrac podetzec z etzce s. Podetzec je uren
promnnou Count, v n je jeho velikost, a promnnou Ind
udvajc pozici v etzci s, odkud se podetzec bere. 
     Pokud je Ind vt ne dlka s, vrt se etzec s. Zadv-
li Count vce znak ne zbv (potno od pozice Ind do
konce), vrt funkce pouze zbvajc znaky.
     Je-li Ind nekladn a Count kladn, vrac funkce dan poet
znak od zatku etzce. Je-li Count zporn nebo 0, funkce
vrac przdn etzec.

Pklad: var s : string;
                     s:=Copy('ABECEDA',4,3); {s='CED'}

Ŀ
  function Pos ( Substr,s : string ) : byte;                


     Funkce uruje pozici podetzce Substr v etzci s, tj.
vrac slo pozice, kde zan etzec Substr. Pokud nen
etzec Substr v s nalezen, funkce vrac 0.
Pklad: var b : byte;
                     s:='ABECEDA';
                     b:=Pos('CED',s);             {b=4}

     Krom funkc existuj pro tento typ tak standardn
procedury:

Ŀ
  procedure Delete(var s:string;Ind:integer;Count:integer); 


     Vstupnm parametrem procedury je znakov etzec s,
procedura Delete vymae od pozice Ind uren poet (Count)
znak. Vsledn etzec je uloen v s. Opt se me stt, e
Ind je vt ne dlka etzce, pak se nic nesmae. V ppad,
e Count je vt ne skuten poet znak, kter do konce
etzce zbv, smaou se pouze znaky od pozice Ind do konce
etzce s.
Pklad: var s : string;
                     s:='ABECEDA';
                     Delete(s,4,3);               {s='ABEA'}           

Ŀ
  procedure Insert(Source:string;var s:string;Ind:integer); 


     Do etzce s je vloen od pozice Ind etzec Source.
Nastane-li situace, e by dlka pekroila hranici 255 znak,
vsledn etzec se "ozne". Je-li Ind vt ne dlka s,
pipoj se vkldan etzec tsn za s.
Pklad: var s1,s2 : string;
                     s1:='ABECEDA';
                     s2:='  ';
                     Insert(s2,s1,4);             {s2='ABE  CEDA'}

Ŀ
  procedure Str ( x : width : decimals;var s : string );    


     Tato asto pouvan procedura pevd selnou hodnotu na
jej znakovou reprezentaci. Vstupnm parametrem je slo x,
kter me bt celoseln nebo reln. Vrazem width se zad
celkov dlka sla vetn desetinn teky, decimals udv
poet desetinnch mst zahrnutch do znakovho pevodu. Stejnm
zpsobem se formtuj vstupy v procedurch write a writeln.
     Nejprve se budeme zabvat ppadem, kdy je pepna ve stavu
{$N-} a x je reln slo:
-  Chyb-li oba parametry, ulo se x standardn celkem na 17
   mst, kde mantisa zabr 13 mst, nsleduje znak E a
   exponent na 3 msta (vetn znamnka).
-  Je-li kladn decimals, formtuje se x ve tvaru relnho
   sla s pevnou desetinnou tekou. To znamen, e se podle
   decimals bu dopln nuly nebo se desetinn rozvoj naopak
   zaokrouhl. Maximln poet desetinnch mst je 11. Na width
   zle, zda se x zleva dopln mezerami. Pokud je width men
   ne celkov poet mst sla x, nebere se width v vahu.
-  Je-li decimals nula, ulo se cel st x bez desetinn
   teky a zleva se dopln mezerami, pokud je width del ne
   dlka cel sti x.
-  Je-li decimals zporn, ulo se x opt ve tvaru s
   exponentem celkem na 8 mst, kde 4 msta jsou pro mantisu
   (vetn znamnka a desetinn teky), pak je E a mantisa na 3
   msta vetn znamnka. Pokud width je vt ne 8, dopluje
   se mantisa a do 10 desetinnch mst, pak se dopluje zleva
   mezerami.
-  Pokud chyb decimals, formtuje se x stejn jako v
   pedchozm bod.
Nyn pejdeme k situaci {$N+}:
-  Chyb-li oba parametry, ukld se x standardn celkem na 23
   mst ve tvaru s exponentem. Pro mantisu je vyhrazeno 17
   mst, pro exponent 6 (vetn E).
-  Je-li decimals zporn nebo nen uvedeno, ulo se x ve
   tvaru s exponentem celkem na 10 mst, mantisa zabere 4
   msta, zbytek exponent. Mantisa se formtuje podle width
   (je-li ovem width vt ne 10) maximln na 17 desetinnch
   mst, pi vtm width se dopluje zleva mezerami.
-  Je-li decimals nula, ulo se cel st bez desetinn teky,
   eventuln zleva doplnn mezerami (podle width).
-  Je-li decimals kladn, formtuje se poet desetinnch mst
   a do celkovho potu 18, pak se podle width (je-li vt
   ne dlka zformtovanho x) pidvaj mezery zleva.
Pro celoseln x plat bez ohledu na stav pepnae {$N}:
-  Nelze uvst decimals, ohls se chyba.
-  Je-li width zporn nebo nula nebo nen uvedeno, ulo se x
   na tolik mst kolik skuten zabr.
-  Je-li width kladn, dopln se x mezerami zleva, je-li width
   men ne poet slic x, je ignorovno.

     Konverze sel na znakov etzce je vhodn zejmna pro
nejrznj formtovn vsledk na obrazovku nebo pro ukldn
dat do soubor. Proto je tak monost omezen potu desetinnch
mst a celkov velikosti.
Pklad: {$N-}
               var x1 : integer;
                     x2 : real;
                     s : string;
               begin
                     x1:=231321;
                     x2:=123.456789;
                     Str(x1,s);                        {s='231321'}
                     Str(x1 : 10,s);              {s='    231321'}
                     Str(x2 : 0 : 11,s);          {s='123.45678900000'}
                     Str(x2 : 0 : 15,s);          {         "}
                     Str(x2 : 7 : 1,s);      {s='  123.4'}
               ... end;

Ŀ
  procedure Val ( s : string; var v; var code : integer);   


     Procedura Val zce navazuje na pedchoz proceduru. Provd
pevod hodnoty uloen jako string do selnho vyjden.
etzec s je vstupn parametr, vstupnmi parametry jsou
seln hodnota v a nvratov kd code. Typ promnn v me bt
celoseln nebo reln. 
     Smysl nvratov kdu je zejm, protoe nkter etzce
nelze pevst na seln vyjden. Je-li etzec nemon
pevst na slo, vrt se v promnn code pozice v etzci s,
kde byla chyba, jinak je v promnn code uloena 0.
Pklad: promnn z pedchozho pkladu
                     Val(s,x1,code);              {uveden do pv. stavu}

     Promnn typu string se pouvaj vude tam, kde je teba
pracovat s textem - nap. naten daj z obrazovky a naopak
vpisy vsledk, apod. K otzce pouit znakovho etzce (tak,
jak je nap. ve standardnm Pascalu - packed array...) se
vrtme v odstavci 2.4.1. 
     Pouit etzc s omezenou dlkou je vhodn nejen kvli
spoe msta (u velkch struktur; u mench jako je string
kvli pedvn parametr, zabrn msta v zsobnku), ale
tak kvli pehlednosti a itelnosti (pro pouvat "vt"
typy ne doopravdy potebuji?).

2.2.6. Ukazatele

     Ukazatele jsou v Pure Pascalu (a samozejm tak ve
standardnm Pacalu) nesmrn dleitm pojmem. m vc budete
programovat, tm vc budete s nejvt pravdpodobnost
pouvat ukazatele. Podrobn je prce s dynamickmi datovmi
strukturami, kter typ ukazatel umouje vytvet, popsna v
6.kapitole. Proto se na tomto mst omezme na strun
seznmen s typem ukazatel.

     Na rozdl od anglitiny, kde ukazatel je pointer, budeme
rozliovat typ ukazatel a peddefinovan typ pointer. Nejprve
se vnujme typu ukazatel. 

     Typ ukazatel reprezentuje adresu v pamti. To znamen, e
promnn typu ukazatel "ukazuje" na promnnou uritho typu,
jen se nazv domnov typ a je specifikovn v deklaraci
ukazatele. Syntaxe:

     <popis typu ukazatel> ::= ^<domnov typ>

     <domnov typ> ::= <identifiktor typu>

     Pokud identifiktor domnovho typu jet nebyl deklarovn,
nevad (toto je zmiovan vjimka z pravidel deklarac), mus
bt deklarovn v kterkoli jin deklaran sti (vetn
podprogramu). Je vhodn deklarovat domnov typ "blzko"
pslunho ukazatele. 
     Jak vyplv ze syntaktickho zpisu, meme deklarovat
ukazatel na libovoln typ. V deklaraci vak nen mon typ
popisovat, mus tam bt pouze identifiktor typu, nap.

     type MujTyp = array [1..100] of byte;
            Ukaz = ^MujTyp;
nelze
     type Ukaz = ^array [1..100] of byte;

     Zpsob uloen typu ukazatel odpovd tomu, e obsahuje
adresu. Je tedy uloen jako dv slova (word), kde offsetov
st adresy je v nim slov, segmentov st adresy ve vym
slov. K organizaci pamti se dostaneme pozdji, ve 3.kapitole
je vysvtlen offset a segment (viz 3.4.7).

     Opertory pro typ ukazatel:
- unrn opertor @ - vrac adresu libovoln promnn, proce
dury, funkce; vsledek je typu pointer
- relan opertory <>,= pro porovnn ukazatel

     Pro typ ukazatel je definovan konstanta nil. Uloena je
tak, e v obou slovech jsou nuly. 

     Na rozdl od standardnho Pascalu nelze pst

     type Polozka = record
                                   jmeno : string;
                                   body  : byte;
                                   ident : char;
                                   dalsi : ^Polozka;
                          end;

ale meme pst (se strukturovanmi typy se seznmme v
ptch odstavcch)

     type DalsiPol = ^Polozka;
            Polozka = record
                                   jmeno : string;
                                   body  : byte;
                                   ident : char;
                                   dalsi : DalsiPol;
                              end;

Pro tento typ meme definovat typovanou konstantu nap. takto
(viz 3.4.2):

     const Prvni : Polozka = (' '; 0; ' '; nil);

     Krom zjitn, "kam" ukazatel odkazuje, je tak dleit
"na co". Typ je jasn z deklarace, hodnotu promnn, na ni
ukazatel odkazuje, zjistme pomoc opertoru dereference, jm
je v Pure Pascalu ipka, nap.

     var zaznam : polozka;
           pocet : word;
     begin ... pocet:=zaznam.body + zaznam.dalsi^.body; ... end;

Tmto zpsobem zpstupnme hodnoty, na kter ukazatel
odkazuje.

     Standardn funkce pro typ ukazatel nebudeme vechny
popisovat, protoe jsou probrny pozdji (viz 6.1 a 7.1),
omezme se na funkce Ofs, Ptr, Seg. Pehled:

     Addr, CSeg, DSeg, Ofs, Ptr, Seg, SPtr, SSeg.

Ŀ
  function Ofs ( x ) : word;                                


     Argumentem x funkce Ofs me bt promnn libovolnho typu
nebo identifiktor podprogramu (nikoli konstanta, literl,
vraz, identifiktor typu apod.). Vsledkem je offsetov st
adresy, na n je x uloeno (resp. vstupnho bodu podprogramu).

Ŀ
  function Seg ( x ) : word;                                


     Funkce pracuje obdobn jako funkce Ofs, vsledkem je
segmentov st adresy.

Ŀ
  function Ptr ( seg, ofs : word ) : pointer;               


     Vsledkem funkce je ukazatel typu pointer na adresu zadanou
offsetem a segmentem adresy. Jednoduch pklad pouit:
     type PtrRec = record Ofs,Seg : word; end;
     var PtrR : PtrRec;
           p : pointer;
     ... p:=Ptr(PtrR.Seg,PtrR.Ofs); ... 

     Na tomto mst sta asi jen pr slov k pouit typu
ukazatel. Hlavn vhoda tohoto typu je ta, e umouje vytvet
dynamick struktury, jejich velikost se bhem provdn
programu dynamicky mn. Promnn typu ukazatel me pracovat s
promnnmi domnovch typ pomoc jejich adresy na heapu. Prv
umstn dynamickch promnnch na heapu poskytuje monost
prce s velkmi strukturami (na heapu je nkolikansobn vc
msta ne v segmentech, kam se ukldaj statick promnn,
jejich velikost se bhem programu nemn). 
     Na druh stran je pouvn ukazatel ponkud nebezpen,
protoe ukazatel, ktermu nebylo vyhrazeno msto v pamti
(nkterou funkc, nap. new), ukazuje na nepedvdateln msto
v pamti, a tud me napchat adu nepjemnost.


     Jak jsme ji ekli, existuje peddefinovan typ pointer.

     Promnn typu pointer i typ ukazatel se pi bhu programu
jev zcela stejn, a to jako ty-bytov adresa pamti. Zsadn
rozdl je v jejich pouvn v programu (tj. pi jejich
pekladu). 
     Typ ukazatel obsahuje vedle informace, e jde o adresu v
pamti, tak informaci o tom, jakho typu je objekt, o jeho
adrese se hovo a tedy i o tom, jak je tento typ velk. Tyto
daje jsou pro peklada dleit nejen z dvod typov
kontroly, ale pro vygenerovn sprvnho kdu. Z tohoto dvodu
pro promnn typu pointer (jen se nkdy pro funkci New chpe
jako ukazatel na promnnou dlky nula) nelze pout
dereferenn opertor ve smyslu odkazu na datovou strukturu. 
Napklad

     var p : pointer;
           q : ^byte;
           ... q^:=p^; ...

proto zpsob chybu.
     Dereferenn opertor na promnn typu pointer lze pout ve
smyslu odkazu na "msto v pamti". Pkladem takovhoto pouit
je:
     var p : pointer;
           b : byte;
     ... p:=@b;
           writeln('Adresa promnn b = ',Seg(p^),':',Ofs(p^));
           writeln('Adresa promnn p = ',Seg(p), ':',Ofs(p));...

     Uloen je stejn jako typ ukazatel. Jedin konstanta typu
pointer je nil.

     Poznamenejme v souvislosti s ukazateli a pointery, e adresy
meme zapisovat tak pomoc literlu typu adresa:

     <literl typu adresa> ::= 
          <konstantn vraz celoselnho typu> : 
          <konstantn vraz celoselnho typu>

     Takto zapsan adresa nen literlem typu pointer a nelze
tedy nap. pst p:=$0000:$A200.
     Funkce a opertory pro pointery jsou stejn jako pro typ
ukazatel. 

     Pouit typu pointer je vhodn tam, kde pracujeme s adresami
v pamti, ale nepotebujeme nebo ani neznme dal daje o
struktue dat v pamti (resp. na tchto adresch), nap.
zatek a konec heapu, uloen adresy opertorem @, apod.

2.3. Ordinln typy

     V tomto odstavci se budeme vnovat vtovmu typu a typu
interval. Na rozdl od u uvedench jednoduchch ordinlnch
typ jsou tyto typy definovny uivatelem a umouj vytvet
vlastn datov typy odpovdajc eenmu problmu.

     <popis ordinlnho typu> ::= - <vtov typ>
                                                    - <typ interval>
                                                    - <id. ordinlnho typu>

     S identifiktory ordinlnch typ jsme se u seznmili, ale
pro plnost je vyjmenujeme:

     <id. ordinlnho typu> ::= - shortint
                                                  - byte
                                                  - integer
                                                  - word
                                                  - longint
                                                  - boolean
                                                  - char

     V samostatnch odstavcch popeme funkce a relan operace
ordinlnch typ.

2.3.1. Vtov typ

     Vtov typ reprezentuje uspodanou mnoinu hodnot
definovanch uivatelem, kde hodnota je dna jmnem
identifiktoru v deklaraci. Syntaxe:

     <vtov typ> ::= 

          <identifiktor> = ( <identifiktor> ,... )

     Identifiktory tvoc vtov typ jsou konstanty v rmci
bloku, kde je deklarovn vtov typ. V deklaraci vtovho
typu nesm bt uvedeny u deklarovan identifiktory typ,
konstant a promnnch. Identifiktor uveden v seznamu
vtovho typu nesm bt pouit v deklaraci vce vtovch
typ, nap.

     type stat = (GB,FR,CS,HOL,IT,POL);
            den = (PO,UT,ST,CT,PA,SO,NE);
            UradDny = (PO,ST,PA);                 { zpsob chybu }

Mohlo by se toti stt, e by se deklaroval typ

     type sex = (muz,zena);
            pohl = (zena,muz);

a v programu by se nedalo urit, o jak typ jde.

     Konstanty se deklaruj obvyklm zpsobem:
     const volno : den=st;
nebo lze rovnou deklarovat netypovanou konstantu
     const volno=st;
avak a za deklarac pslunho vtovho typu.

     Kad poloka je reprezentovna svou ordinalitou, tj.
poadovm slem. Poloky jsou oslovny od nuly (nap. CT z
minulho pkladu je uloen jako slo 3).
     Zpsob uloen zvis na potu poloek ve vtovm typu.
Pokud jich je 256 nebo mn, jsou uloeny jako byte, jinak jsou
uloeny jako slovo. Ppad vtovho typu s vce ne 256
polokami ale asi nen moc frekventovan.

     Vtov typy je vhodn pout k popisu veliiny, kter
nabv nkolika monch hodnot (nap. sttn pslunost, den v
tdnu,...). Pouit vtovho typu by se dalo obejt a veliinu
zakdovat teba pomoc celch sel integer. Krom hor
orientace v programu (a vt pravdpodobnosti chyby) by vak
byla tak oslabena typov kontrola. Promnn vtovho typu sm
toti nabvat pouze hodnot uvedench v seznamu vtovho typu,
zatmco promnn typu integer je omezena jen rozsahem typu
integer.
     Poznamenejme, e promnn vtovho typu nelze st ani
zapisovat.
     Z typ, s nimi jsme se doposud seznmili, je specilnm
vtovm typem typ boolean definovan dvma uspodanmi
hodnotami true a false.

2.3.2. Interval

     Typ interval je souvisl uspodan mnoina hodnot nkterho
ordinlnho typu (tak zvan hostitelsk typ). U promnnch typu
interval jsou ppustn vechny operace ppustn nad
hostitelskm typem, ale omezuje se mnoina hodnot, kterch
promnn typu interval mohou nabvat. Interval se vymez
zadnm doln a horn hranice, jak je patrn ze syntaktickho
zpisu:

     <typ interval> ::= - <konstantn vraz>..<konstantn vraz>
                                    - <id. ordinlnho typu>

kde oba konstantn vrazy mus bt tho ordinlnho typu
(resp. typy kompatibiln vzhledem k piazen, viz 3.1.2) a
horn mez (druh vraz) nesm bt men ne doln mez (prvn
vraz). Nkolik pklad:

     const A = 'A';
     type pismena = A..'Z';
ale tak lze
     type pismena = 'A'..'Z';

dal pklady (vracme se k ve uvedenm pkladm vtovch
typ)

     type turnaj = GB..HOL;
            velikost = 100..200
     const A1=1;
               A2=5;

avak pozor:
     type int = (A1-A2) div 2..(A1+A2) div 2;

nelze - peklada nerozli od vtovho typu a ohls
syntaktickou chybu, nebo - doln mez NESM zanat zvorkou,
een:
            int = 1*(A1-A2) div 2..(A1+A2) div 2;
Na uvedenm pkladu je vidt rozdl od standardnho Pascalu,
kde se nemohou v definici konstant vyskytovat vrazy. 
     Promnn typu interval jsou uloeny podle hostitelskho
typu.
     Pro veliiny, o nich pedem vte, e mohou nabvat hodnot
pouze v omezenm rozsahu, je sprvn deklarovat typ interval.
Opt zvte zabezpeenost programu proti chybm a usnadnte si
prci pi dalm pouvn tohoto intervalu (nap. v
deklaracch pol, jak pozdji uvidte). 
     Ale pozor na takovou situaci:
     var i : 1..10;
     i:=1;
     while i<=10 do
          begin ... i:=i+1; ... end;

Po proveden cyklu program skon bhovou chybou 201, protoe
pi poslednm prchodu cyklem je i=10, pak se zvt na 11 a
tm zpsob chybu, protoe ppustn hodnoty jsou od 1 do 10.
Proto pouvejte pro promnn typu interval radji for cykly
(viz 3.2.3).

2.3.3. Funkce nad ordinlnmi typy

     Ordinln typy jsou typy, na nich existuje linern
uspodn a pro kadou hodnotu ordinlnho typu (mimo nejvt
a nejmen hodnoty) existuje jej pm pedchdce (s vjimkou
nejmen hodnoty) a nslednk (krom nejvt hodnoty).
     Jde o tyto typy: celoseln typy, char, boolean, vtov
typ a typ interval.

     Pro ordinln typy jsou definovny standardn funkce Ord,
Pred, Succ a procedury Dec, Inc. <OrdTyp> oznauje ordinln
typ:

Ŀ
  function Ord ( x : <OrdTyp> ) : longint;                  


     Vsledkem funkce je ordinalita x. Ta je dna uspodnm
hodnot, jak si ukeme v nsledujcm odstavci.

Ŀ
  function Pred ( x : <OrdTyp> ) : <OrdTyp>;                


     Funkce vrac pedchdce hodnoty x, tj. prvek s ordinalitou
Ord(x) - 1.
Pklad:
     ... d:=PA; ... d:=Pred(d); ...               { d = CT }

Ŀ
  function Succ ( x : <OrdTyp> ) : <OrdTyp>;                


     Funkce vrac nslednka hodnoty x, jeho ordinalita je
Ord(x) + 1.
Pklad:
     ... d:=PA; ... d:=Succ(d); ...               { d = SO }

     Procedura Dec i Inc m dva mon tvary:

Ŀ
  procedure Dec ( var x );                                  


Ŀ
  procedure Dec ( var x; n : longint );                     


     x je promnn ordinlnho typu, n je celoseln vraz. Pi
zavoln procedury je do x uloen pedchdce vstupn hodnoty x.
Je-li funkce volna se zadanm n, ulo se do promnn x
hodnota, jej ordinalita je o n men ne ordinalita vstupn
hodnoty (vlastn se vrtme k n-tmu pedchdci).
     Pokus o zskn pedchdce mimo obor hodnot (nap.
pedchdce prvn hodnoty) zpsob bhovou chybu 201 (Range
Check Error), stejn jako u Pred.
Pklad:
     var d : den; 
           i : 1..10;
           ... d:=ST; Dec(d); ...            { d = UT }
           ... i:=100; Dec(i,10); ...        { i = 90 }

Ŀ
  procedure Inc ( var x );                                  


Ŀ
 procedure Inc ( var x; n : longint);                      


     Analogick procedura jako pedchoz, zvtuje popsanm
zpsobem hodnoty, vrac tedy bu nslednka nebo n-tho
nslednka. Opt pozor na pekroen oboru hodnot!
Pklad (pokraujeme v minulm p.):
           ... Inc(i,5); ...                 { i = 95 }
           ... Inc(d,2); ...                 { d = CT }

2.3.4. Uspodn a relan operace

     U jsme mnohokrt vyuvali toho, e ordinln typy jsou
uspodan. Toto uspodn je dan ordinalitou, co je
oslovn mnoiny hodnot. Kad hodnota ordinlnho typu m
svoji ordinalita, kterou meme zjistit funkc Ord.

     Pro celoseln typy odpovd ordinalita jejich hodnot.
Ordinalita znak je rovna oslovn znak podle ASCII tabulky
slem od 0 do 255. Ordinalitu typu boolean jsme u uvedli.
Uspodn vtovho typu je dan poadm identifiktor v
deklaraci. Prvn identifiktor m ordinalitu 0, druh 1, atd. U
promnnch typu interval je uspodn pevzato z hostitelskho
typu.
    Relan operartory pro ordinln typy jsou tyto:
           <,>,<=,>=,=,<>.
Porovnn se provd podle ordinality.

2.4. Strukturovan typy  

     Jednoduch typy, kter jsme do tto chvle probrali, slou
k uchovn jedn hodnoty. V praktickch situacch vak
potebujeme evidovat vce hodnot a obvykle tak ve vtm
stupni abstrakce. Vhodou takovho pstupu je rozlenn dat
na rzn rovn. Vtinou to odpovd zpsobu programovn -
postupn rozklad lohy na jednodu problmy. Dal vhodou je
tak monost snadnho proveden hromadnch operac. 
     Strukturovan typy se asto pouvaj spolen s ukazateli,
a u ve form ukazatele na strukturu nebo jako soust
struktury. Filozofie prce se strukturovanmi typy a
nejrznj abstraktn datov struktury jsou pedmtem kapitoly
6.

     <popis strukturovanho typu> ::= - <popis typu pole>
                                                        - <popis typu zznam>
                                                        - <popis typu mnoina>
                                                        - <popis typu object>
                                                        - <popis typu soubor>
                                                        - <popis typu podprogram>

2.4.1. Pole 

     Typ pole sdruuje datov poloky tho typu. Deklarace typu
pole:

     <popis typu pole> ::= array [ <oznaen typu interval>,... ]

          of <oznaen typu>

     Typ interval uruje poet poloek v poli. Poet dimenz, tj.
poet index (poet uvedench interval) v deklaraci, je
neomezen. 
     Klov slovo packed m v Pure Pascalu (oproti norm) pouze
vznam komente.

     Typem poloky me bt jakkoli typ vetn strukturovanch,
mete mt pole zznam apod. Speciln to me bt zase typ
pole. Takov typ je ale ekvivalentn vcerozmrnmu poli, nap.

     type matice = array [1..10] of array [boolean] of real;
je tot jako
     type matice = array [1..10,boolean] of real;

V tomto ppad je pehlednj deklarovat vcerozmrn pole.

     Nemete mt libovoln velk pole, protoe jste vzni
velikost segmentu, ta je 64 KB. Vt strukturu lze realizovat
jedin pomoc ukazatel v heapu. Velikost pole snadno spotte
jako velikost poloky krt celkov poet poloek.

    Zpsob uloen

     Typ pole je uloen jako posloupnost poloek (jednotliv
poloky se ukldaj podle svho typu). Poad uloen je dno
indexem, poloka s nejnim indexem je uloena na nejni
adrese. Vcerozmrn pole je uloeno opt jako posloupnost, kde
indexy vzrstaj "zprava". 
Nap.
     type pole = array [1..10,1..3] of integer;
     var p : pole;

promnn p typu pole je ukldna v poad: p[1,1], p[1,2],
p[1,3],p[2,1],p[2,2],...

     Adresa konkrtn poloky se spot jako nsobek dlky
poloky a poad poloky v poli (v posloupnosti poloek, jak
jsme ji ped chvl uvdli).

     Typovan konstanty

     Nejprve syntaxe:

     <konstanta typu pole> ::= ( <typovan konstanta>,... )

Zadn konstant ukeme na pkladech:

     type tyden = (PO,UT,ST,CT,PA,SO,NE);
            volno = SO..NE;
            turnaj = PO..ST;
            rozsah = 1..3;
            vysledky = array [turnaj,rozsah] of byte;
            tabulka = array [1..5] of byte;
     const prvni : vysledky = ((0,0,0),(0,0,0),(0,0,0));
            tab : tabulka = (12,5,47,0,0);

     Pstup ke slokm typu pole je pomoc indexu podle
syntaktickho pravidla:

     <pstup k poloce> ::= <id. pole> <index>

     <index> ::= [ <vraz>,... ]

     Poznamenejme, e zpis nap. sloky dvouroznrnho pole
a[i][j] je ekvivalentn zpisu a[i,j].

     Standardn funkce a procedury mete pouvat pro poloky
pole podle jejich typu, tj. pro prvky pole s celoselnmi
polokami mete pouvat pslun funkce pro celoseln
typy.

     Typ pole sdruuje poloky stejnho typu, proto se hod pro
reprezentaci rznch tabulek (nap. matice), ukldn
"homogennch daj". Krom toho se vytvej sloitj
struktury kombinac rznch strukturovanch typ (viz kapitola
6). Pstup k polokm pomoc index poskytuje monost
hromadnch operac v cyklu, nejastji for cyklu.
Jednoduch pklad: nsoben matice vektorem

     const maxX = 10;
     type matice = array [1..maxX,1..maxX] of real;
            vektor = array [1..maxX] of real;
     var A : matice;               { vstupn matice }
           V : vektor;             { vstupn vektor }
           VYSL : vektor;          { vsledek nsoben, vsledkem je 
                                               opt vektor }
           i,j : byte;             { pomocn promnn }
     ...
           for i:=1 to maxX do VYSL[i]:=0;        { inicializace }
           for i:=1 to maxX do
                for j:=1 to maxX do VYSL[i]=A[i,j]*V[j]; ...

     Na zvr se jet vrtme k rozdlm mezi typem string a
polem znak. Vsadn postaven m znakov etzec, jen je v
norm Pascalu deklarovn jako

     array [1 .. <konstantn vraz>] of char;

a na tomto typu je definovno uspodn stejn jako pro
string. V Pure Pascalu mohou mt znakov etzce libovoln
meze, tj. jsou typu

     array [<konstantn vraz> .. <konstantn vraz>] of char;

je pro n definovan uspodn a promnnou typu znakov
etzec lze piadit promnn typu string.
     Znakov etzec m tedy v deklaraci pesn uren poet
poloek, nem ale dnou poloku, v n by byla uloena jeho
dlka. etzce maj poloku s indexem 0, kde je uvedena jejich
dlka. Promnn peddefinovanho typu string me bt vsledkem
funkce, co promnn typu znakov etzec bt neme. O dalch
rozdlech se dozvte v kapitole 3 v souvislosti s vrazy a
piazovnm hodnoty promnn typu etzec a typu znakov
etzec. 
     S etzci se pracuje pohodlnji, je pro n napsna ada
standardnch funkc usnadujcch prci s texty. Promnn typu
etzec se asto pouvaj spolen s textovmi soubory pi
ten a zpisu do souboru. Promnn typu znakov etzec se
mohou uvat nap. pi formtovn daj do tabulek.

2.4.2. Zznam

   Na rozdl od strukturovanho typu pole slou typ zznam ke
sdruen poloek rznch typ. Nejprve si uvedeme syntaktick
pravidla:
                                                      Ŀ
   <popis typu zznam> ::= record  <seznam poloek>;...  end
                                                      

   <seznam poloek> ::= 

      -  <id. poloky> ,...  : <oznaen typu>
                            Ŀ
      - case  <id. poloky> :  <id. typu> of 
                            
                                                      Ŀ
              <case-varianta> : (  <seznam poloek>;...  )
                                                      

   <case-varianta> ::= 
                                              Ŀ
      <konstantn vraz>  .. <konstantn vraz>   ,...
                                              

   Velikost typu zznam nen omezena potem a typy poloek,
pouze celkov velikost struktury mus bt men ne 64 KB (=ve-
likost segmentu).

   Identifiktory mus bt v rmci zznamu rzn, mohou se vak
shodovat s identifiktory vn deklarace zznamu. Identifiktory
poloek zznamu jsou lokln identifiktory (viz 3.4.4)
vzhledem k ostatnm stem programu.

   Jak je ze syntaxe patrn, m zznam v zsad dv sti.
Prvn sti budeme kat pevn st, obsahuje vyjmenovan
poloky zznamu, kter se vyskytuj ve vech variantch, nap.
daje o studentech

   type Stav = (studuje,preruseno);
        Evidence1 = record
                       jmeno,adresa : string[50];
                       vek          : byte;
                       StudStav     : Stav;
                    end;

     {Typ Evidence1 m tedy vdy 4 uveden poloky.}

   Druh st se nazv variantn st zznamu. Pouv se pro
vyjden rznch variant stejnho typu. Chtli bychom
napklad jet rozit pedchoz pklad a podle studijnho
stavu sledovat u studujcch student poet splnnch zkouek a
zpot, u student, kte studium peruili, evidovat adresu
zamstnavatele a datum peruen studia. Pouijeme variantn
zznam:

   type Evidence2 = record 
                       jmeno,adresa : string[50];
                       vek          : byte;
                       StudStav     : Stav;
                       case Stav of 
                        studuje   : (zkousky,zapocty : 0..10);
                        preruseno : (AdrZam : string;
                                                    datum  : string[8]);
                    end;

     {Typ Evidence2 m vdy 4 poloky: jmeno, adresa, vek,
      StudStav. Dal 2 poloky se vybraj podle hodnoty poloky
      StudStav - tedy bu poloky zkousky, zapocty nebo AdrZam, 
      datum.}

   Poloka, podle kter se vybr pslun varianta zznamu,
se nazv rozliovac poloka, jej typ rozliovac typ
variantn sti. Pokud je po case uvedena poloka, zahrne se
automaticky mezi poloky zznamu (jej identifiktor se nesm v
deklaraci zznamu opakovat). Oproti standardnmu Pascalu je
pouit rozliovac poloky pouze zkratkou za explicitn
vypsn tto poloky v pevn sti a pouit tho
rozliovacho typu jako je typ tto poloky. Pedchozmu
pkladu je tedy ekvivalentn zpis variantn sti:

     type Evidence2 = record
                                     jmeno,adresa : string[50];
                                     vek          : byte;
                                     case StudStav : Stav of
                                        studuje   : (zkousky,zapocty : 0..10);
                                        preruseno : (AdrZam : string;
                                                         datum  : string[8]);
                                     end;

     Z hlediska normy Pascalu [WIRTH] se k obma pistupuje, jako
by rozliovac poloka nebyla deklarovna.
   Rozliovac typ mus bt ordinln. V ppad, e jsou
varianty rozliovny pouze rozliovacm typem, mus bt uveden
tento typ identifiktorem. Pokud je vbr provdn pomoc
rozliovac poloky, nemus bt oproti standardnmu Pascalu
uveden identifiktor typu, ale me bt pouit pmo jeho popis
(viz pklad). Nejastji se uv vtov typ, typ boolean
nebo intervaly. Napklad nsledujc zpis je ve standardnm
Pascalu chybn:

     type priklad = record
                                   case varianta : 0..2 of
                                               0 : (znak1 : byte);
                                               1 : (znak2 : string);
                                               2 : (znak3 : boolean);
                                   end;

     {Typ priklad m poloku varianta a dal poloku, kterou je
     bu znak1 nebo znak2 nebo znak3, podle hodnoty poloky
     varianta.}

Ve variantn sti mus bt uvedena alespo jedna varianta.
POZOR - nen provdna kontrola mezi rozliovacm typem a
skuten vypsanmi variantami, take v nsledujcm zpise nen
hlena chyba:

    type Evidence2 = record
                        ... case Stav of
                               0 : (zkousky,zapocty : 0..10);
                               1 : (AdrZam : string;
                                                        datum  : string[8]);
                     end;

   Rozliovac typ (bez rozliovac poloky) je vhodn pout,
kdy je z kontextu jasn varianta (v uvedenm pklad se sta
odkzat na studijn stav).

   Vet variant nemus bt pln. Zabezpeenost programu je v
tomto ppad pln na programtorovi. Rozliovac typ a
jednotliv varianty maj pouze dekorativn charakter (podobn
jako hlavika programu). Do Pure Pascalu byly zahrnuty jen s
ohledem na kompatibilitu s normou Pascalu. Jednotliv varianty
fakticky nemaj dn jmno a jsou pouvny pouze jako
redefinice zznamu. Identifiktory poloek ve variantch mus
bt navzjem rzn (i vi pevn sti i dalm variantm). 
     Z uvedenho plyne, e korektn je napklad i takovto
zpis:

     type aa = record
                          case boolean of
                               'A' : (x,y : byte);
                               'A' : (z : word);
                               'A' : (t : longint);
                          end;

   Variantn st mus nsledovat a po pevn sti zznamu.

   Typ zznam je uloen jako spojit posloupnost poloek, prvn
poloka je uloena na nejni adrese. Variantn st se ukld
vdy od stejn adresy v pamti. Vyhrazen msto odpovd nej-
del variant.

   Samozejm se mohou pro typ zznam deklarovat typovan kon-
stanty, syntaxe:

   <konstanta typu zznam> ::= 

      ( <id. poloky> : <typovan konstanta> ;... )

   Vet jednotlivch poloek mus odpovdat poad v
deklaraci. Vet poloek nemus bt pln v tom smyslu, e me
chybt libovoln poet poloek "od konce" (kdyby toti chybla
napklad druh poloka, ohlsila by se chyba v poad poloek,
protoe na mst druh poloky by byla tet). Prvn poloka v
zznamu mus bt uvedena vdy. Peklada nekontroluje, zda
varianta o prvni = '*''A''*';  {uloili jsme etzec *'A'*}
               druha = '''A''';    {   "            "      'A'}
               treti = '''''A''''';{   "            "    ''A''}

     U typu string se poprv setkvme s pstupem ke slokm
typu. U jsme naznaili, e je velmi pbuzn s typem pole.
Tak pstup k jednotlivm znakm v etzci je podobn,
syntaktick zpis:

     <element etzce> ::= <id. etzce>[<celoseln vraz>]

Nkolik pklad:

     var s1 : string;
           s2 : string[5];
     begin ... s2:=s1[255];...s2:=s1[50]; ... end;
ale nelze
                    s1:=s2[6];

Zpis s1[0] m smysl, protoe na "nult " pozici v etzci je
znak odpovdajc dlce etzce (viz uloen v potai). Dlku
etzce (nap. s1) meme urit takto:
     Ord(s1[0])
Tento zpsob pouijte pouze z vnch dvod, mnohem lep je
pout funkci Length, kter tak ur dlku etzce, ale zpis
je mnohem pehlednj.

     Nyn pejdeme ke standardnm funkcm:

Ŀ
  function Length ( s : string ) : integer;                 


     Tato funkce uruje dlku etzce s. Samozejm Length(s) =
Ord(s[0]).

Ŀ
  function Concat ( s ,... : string ) : string;             

Odpovd hodnot rozliovac poloky. Pokud zznam obsahuje poloku typu
soubor, nen mon definovat konstantu.
Pklad:

   const Stud1 : Evidence1 = (jmeno:''; adresa:''; vek:0;      
                              StudStav:studuje);
         Stud2 : Evidence2 = (jmeno:''; adresa:''; vek:0;      
                                   StudStav:studuje; zkousky:0;
                              zapocty:0);

   Jet jednou upozornn: vbr patn varianty (tj. poloek
neodpovdajcch hodnot rozliovac poloky nebo typu)
nezpsob chybu! Jasnj to je na pkladu:

     const Stud3 : Evidence2 = (jmeno:''; adresa:''; vek:0;
                                                  StudStav:studuje; AdrZam='';
                                                  datum='00-00-00');

     {Sprvn tvar konstanty je samozejm Stud2, konstanta Stud3
      m patn vybran variantn poloky.}

   Pstup k polokm v zznamu se provd pomoc jmna poloky
a tekov notace, co meme zapsat

   <pstup k poloce> ::= <id. typu zznam>.<id. poloky>

V naem ppad
   var evid : Evidence1;
   ...evid.vek:=evid.vek + 1;...

   Krom tohoto zpsobu pstupu k polokm zznamu se tak
pouv pkaz with, kter vrazn usnaduje prci s polokami
zznamu (viz 3.2.5).

   Na zvr tohoto odstavce se jet krtce vrtme k pouvn
typu zznam:
-  Zaveden typu zznam by mlo odpovdat een loze, tzn.   
   poloky jednoho zznamu maj logickou souvislost (vztahuj
   se  k jedinmu "objektu").
-  U jsme se nkolikrt zmnili o mal zabezpeenosti varian- 
    tnch zznam, kontroly jsou vc programtora!
-  Typ zznam se asto kombinuje s typem pole (pole zznam), o 
   sloitjch strukturch se dozvte v kapitole 6.
-  Typickm pkladem pouit je evidence daj (ve ve uve-  
   denm pklad o studentech) rznch typ.
-  Zznamy se mohou ukldat do soubor.

2.4.3. Mnoina

   Obor hodnot typu mnoina obsahuje vechny podmnoiny
bzovho typu, co je typ, kter se zadv v deklaraci typu
mnoina. Konkrtn tvar mnoiny se uruje a v programu.

   Datov typ mnoina deklarujeme takto:

   <typ mnoina> ::= set of <bzov typ>

     <bzov typ> ::= <popis ordinlnho typu>

   Bzov typ je ordinln typ, kter nem vce ne 256 hodnot,
piem ordinalita doln a horn meze je v rozmez 0 a 255.
Toto omezen je pochopiteln, kdy uvme, e datov typ mno-
ina reprezentuje vechny mon podmnoiny bzovho typu. Poet
vech podmnoin je 2 umocnno na mohutnost bzovho typu (zde
rozumme mohutnost bzovho typu poet sloek tohoto typu).

   Mnoina je uloena jako pole bit, kde kad bit odpovd
prvku v mnoin a uruje, zda prvek do mnoiny pat nebo ne.
Prvn bit (potno zprava) odpovd (Min div 8)*8, dal bity
odpovdaj dalm hodnotm a k horn hranici bzovho typu.
Maximln poet prvk je 256, tedy mnoina zabr nejvce 32
byt. Poet byt "skuten zabranch" mnoinou urme podle
vzorce:

   ByteSize = (Max div 8) - (Min div 8) + 1

kde Max, resp. Min je horn, resp. doln hranice bzovho typu
mnoiny. Napklad promnn typu set of 9..14 zabere 1 byte a
hodnota [10,12,13] je uloena takto: 0,0,1,1,0,1,0,0.

   Opertory pouvan pro typ mnoina maj tentokrt mnoinov
vznam:
   + - sjednocen mnoin
   - - rozdl mnoin
   * - prnik mnoin

Relan opertory nyn odpovdaj mnoinovmu porovnn:

   <=,>=,<,> - mnoinov "je st"
   <>,= - porovnn nerovn se, rovn se
   in - pouze mnoinov opertor vyjadujc mnoinovou relaci 
       "je prvkem"

   Peddefinovan konstanta typu mnoina je przdn mnoina.
Oznaujeme ji zpisem []. 
   Konstantu typu mnoina vytvome podle nsledujcch pra-
videl:

   <konstanta typu mnoina> ::=
                [ - <konstantn vraz>                      ,...]
               - <konstantn vraz> .. <konstantn vraz>

Poznamenejme, e prvky se ve vtu mohou opakovat (to odpovd
mnoinm v matematickm smyslu), ale mnoina nesm bt soust
mnoiny.

   Na zvr pklad - definujeme si mnoinu vech znak,
mnoinu velkch psmen a zavedeme typovan konstanty:

   type Znaky = set of char;
        Pismena = set of 'A'..'Z';
   const Spec : Znaky = [#33 .. #47,#58 .. #64,'',''];
         Samohlasky : Pismena = ['A','E','I','O','U','Y'];

   Podmnku, e znakov promnn je samohlska, zapeme bez
mnoin takto

   var c : char;
   ...if (c='A')or(c='E')or(c='I')or(c='O')or(c='U')or(c='Y')
          then ...

ale pomoc mnoin mnohem snadnji

   ...if c in Samohlasky then ...

   Jak je vidt u z tohoto jednoduchho pkladu, pispvaj
mnoiny k jasnjmu a itelnjmu programovn. Krom toho se
asto pouvaj pi petypovn, ale s petypovnm se obezn-
mme a ve 3. a 6.kapitole.

2.4.4. Object

     vod

     V pedchozm odstavci jsme poznali typ zznam. Umouje
popsat realitu "pirozenm" zpsobem - sdruuje poloky sice
rznch typ, ale logicky k sob patc. 
     asto k datovm polokm logicky pat tak nkter operace.
Tyto operace meme definovat jako podprogram, ale syntakticky
zapsan mimo typ zznam. Logick vztah operac a datovch
poloek zajiuje programtor.
     Rozlenn dat podle rznch monost umouj variantn
zznamy. Pak ale musme zrove uvdt i podprogramy a ladit
vechno najednou, co je nepehledn a snadno se udl chyba.
Tyto problmy e nov datov typ object, kter je zaveden v
Pure Pascalu 5.5.

     Vlastnosti objekt

     Objekt je struktura obsahujc pevn poet sloek. Kad
sloka je bu poloka uritho typu nebo metoda, kter provd
operace na objektu. Typ object m ti zkladn vlastnosti:

-  Hierarchick uspodn - typ object me ddit sloky od
   jinho typu object. Tato ddinost je tranzitivn (pen
   se dalm ddnm), tj. T2 dd od T1 a T3 dd od T2, pak
   tak T3 dd od T1, tm se vytv hierarchick struktura
   mezi jednotlivmi objekty.
-  U typu object jsou syntakticky spojen datov poloky a
   metody pracujc s tmito daty (metodami rozumme libovoln
   podprogram deklarovan v typu object).
-  Virtualizace je monost vytven dynamickch metod, kter
   se vyhodnocuj a pi bhu programu, nikoli v dob pekladu.

     Vznam hierarchizace

     Monost hierarchizace nen nic pevratnho (variantn zznam
to tak zvldne), ale ve spojen s metodami zskvme mocn
syntaktick nstroj, pomoc nho znan zvme itelnost
programu a urychlme proces ladn. Mme-li reprezentovat
nkolik podobnch objekt relnho svta, vybereme nejprve to,
co maj spolen. Z dat a metod popisujcch toto spolen
vytvome jeden typ object. Podprogramy nad nm bezpen
odladme a pak se pustme do tvorby jednotlivch "potomk", tj.
objekt, kter reprezentuj specilnj vlastnosti. Ji nstin
tohoto postupu indikuje rychlost a bezpenost. Zkuste si to ...
     U typu object jsou zavedeny nov pojmy pedek a potomek.
Budeme je pouvat v souvislosti se syntaktickmi zpisy
objekt: 
-  Identifiktor typu object me bt uveden pi deklaraci v
   popisu jinho typu object (pesn pravidlo viz syntaxe),
   deklarovan objekt se nazv potomek, objekt uvdn je
   pedek. 
-  Pedek pedv svoje poloky a metody jednomu nebo vce
   potomkm, kte mohou mt dal metody a poloky. Potomek
   obsahuje tedy vedle svch sloek tak sloky struktury
   pedka, tomuto postupu zskn poloek a metod kme
   ddn. 

     Potomk jednoho pedka me bt vce. Pedek se tedy
explicitn uvd v deklaraci typu object.

     Vznam metod

     Typ object pedstavuje dal zobecnn zznamu tm, e se v
deklaraci typu object uvdj tak metody, kter jsou takto
syntakticky spojeny s datovmi polokami objektu. U zznamu
jste mohli pracovat podobn, ale spojen podprogram a dat bylo
pouze smantick, zatmco toto spojen poloek a metod v jednom
typu zvyuje zabezpeenost a itelnost programu. Zmenuje se
toti nebezpe, e pouijete sprvnou metodu na patn data,
protoe vechny operace s datovmi polokami typu object by
mly bt zajitny metodami.
     V Pure Pascalu 5.5 existuj oproti verzi 5.0 podprogramy
konstruktor a destruktor pro prci s virtulnmi metodami.
Dve ne je volna jakkoli virtuln metoda, mus se vyvolat
metoda konstruktor. Metoda konstruktor inicializuje dynamick
objekty, destruktor pam uvoluje (viz 6.4).

     Syntaktick pravidla deklarace typu object

     <popis typu object> ::= 

                   Ŀ                  Ŀ             Ŀ
      object <pedek><seznam poloek>;...;<seznam metod>
                                                  
               end

     <pedek> ::= ( <id. typu object> )

                                                 Ŀ
   <seznam metod> ::= <hlavika metody>  ; virtual  ;...
                                                 

     <hlavika metody> ::= - <hlavika procedury>
                                         - <hlavika konstruktoru>
                                         - <hlavika destruktoru>
                                         - <hlavika funkce>

     Poznamenejme, e <seznam poloek> byl popsn v odstavci
vnovanm zznamm. Objekt je typ s pevnm potem sloek, nen
tedy mon v deklaraci pout variantn st. Objekt ale me
mt poloku typu zznam, kter obsahuje variantn st.
     Definice metod pipomn unity, protoe ve vlastn deklaraci
typu object je uvedena jen hlavika metody, kter k "co
metoda dl", kdeto tlo metody, kter k "jak to dl", je
uvedeno a po deklaraci typu object. 
     Syntaxe definice metody je shodn se syntax deklarace
podprogramu (viz 3.4.2.), s tm rozdlem, e identifiktor
procedury (resp. funkce) je kvalifikovan. Kvalifikovan
identifiktor m tento tvar:

                    <id. typu object> . <id. metody>

nap.: procedure PrvniObjekt.Proc(var x,y : byte);
           constructor PrvniObjekt.Init;
           function PrvniObjekt.Func(x : real) : real;

     Metody, u nich je uvedeno klov slovo virtual, se
nazvaj virtuln metody. Popis jejich vlastnost najde ten
v odstavci 6.4.

     Omezen

Pi prci s typem object existuje nkolik omezen:
-  Objekty mohou bt deklarovan pouze v sti daklarac
   hlavnho programu nebo v unitch.
-  Identifiktory poloek i metod mus bt jednoznan v rmci
   bloku deklarace objektu.
-  Formln parametry metod mus mt odlin identifiktory od
   poloek objektu vetn zddnch poloek.
-  Identifiktory poloek mus bt jednoznan vzhledem k
   ddn (potomek neme mt poloku se stejnm
   identifiktorem jako nkter poloka u pedka). Pro metody
   toto omezen neplat, protoe potomek me mt metodu se
   stejnm identifiktorem jako byla zddn metoda. Pstupn
   je pak metoda potomka.
-  Typ object neme bt soust souboru, a to ani jako
   soust jinho strukturovanho typu.
-  Pi deklaraci potomka se musme odvolvat na pedka, kter
   u byl deklarovn dve. Poznamenejme, e pi deklarovn
   hlaviek metod meme ut jako parametr prv deklarovan
   typ object, napklad:

          type MujObjekt = object
                                          a : byte;
                                          b : string;
                                          procedure Start(var MO : MujObjekt);
                                     end;

     Forma uloen

     Jet ne se seznmme s uloenm objekt, definujeme si
nov pojmy:
     -Instance je promnn typu object; me bt statick nebo
      dynamick.
     -Atributy objektu jsou jeho poloky a metody vetn
      zddnch.
     -Prefix objektu je objekt, jeho vechny atributy
      specifikovan objekt dd.
     -Podobjekt danho objektu je potomek tohoto objektu.

    Pklady:

          type A1 = object
                               a,b,c : byte;
                               procedure Made(var x,y,z : byte);
                          end;
                 A2 = object (A1)
                               d,e,f : byte;
                          end;
                 A3 = object (A1)
                               g : byte;
                               constructor Start;
                               procedure Get(p:byte; var q:byte);virtual;
                               destructor Finish;
                          end;
                 A4 = object(A3)
                               h,i : byte;
                          end;
          var OA : A1;
                OB,OC : A3;

     Instance jsou OA, OB, OC.
     Prefix objektu A2 je A1,
          "         "         A3 je A1,
          "         "         A4 je A3.
     Podobjekty objektu A1 jsou A2, A3,
     podobjekt objektu A3 je A4.
Ze syntaktickho hlediska meme provzn objekt nakreslit a
komentovat:

                         Ŀ
                          A1 
                         
                    Ŀ
                 Ŀ          Ŀ
                  A2            A3 
                           
                                    
                                 Ŀ
                                  A4 
                                 

     A1 je pedek objekt A2, A3, ti jsou jeho potomci,
     A3      "    objektu A4, ten je jeho potomkem.

     Zpsob uloen typu object je podobn uloen zznamu.
Poloky objektu se ukldaj postupn podle poad v deklaraci
jako souvisl posloupnost. V ppad podobjektu jsou uloeny
nejprve poloky prefixu, potom poloky podobjektu.
     Pokud m objekt virtuln metody (konstruktor), peklada
vytvo zvltn 2 bytovou poloku, kter se nazv virtual
method table (VMT) field (co je adresa VMT) a ulo jej jako
posledn poloku objektu. Zdd-li objekt virtuln metody (a
tedy tak destruktor a konstruktor), zdd tak VMT. Tato VMT
existuje nejv jednou pro kad typ object.
     Meme se vrtit k pedchozmu pkladu a uloen graficky
znzornit:

           A1           A2          A3         A4
         Ŀ     Ŀ     Ŀ    Ŀ
           a         a         a        a  
         Ĵ     Ĵ     Ĵ    Ĵ
           b         b         b        b  
         Ĵ     Ĵ     Ĵ    Ĵ
           c         c         c        c  
              Ĵ     Ĵ    Ĵ
                       d         g        g  
                     Ĵ     Ĵ    Ĵ
                       e       @VMT     @VMT 
                     Ĵ         Ĵ
                       f                    h  
                                     Ĵ
                                              i  
                                            

     Typovan konstanty

     Syntaxe:

     <konstanta typu object> ::= 

          ( <id. poloky> : <typovan konstanta>;... )

     Tvo se podobn jako u typu zznam. Pravidla shrneme do
nkolika bod:
-  Metody se nemohou vyskytovat v typovan konstant.
-  Poad poloek v deklaraci typovan konstanty mus odpovdat
   poad v deklaraci typu.
-  U podobjekt se nejprve uvdj poloky prefixu, pak teprve
   poloky podobjektu.
-  V deklaraci nemus bt pln vet poloek objektu, prvn
   poloka mus bt uvedena. Vzhledem k tomu, e poad poloek
   mus odpovdat poad v deklaraci typu object, mohou chybt
   pouze poloky "od konce tvoc souvislou adu" (viz
   konstanta typu zznam).

Pklad typovanch konstant v naem ppad:

     const KonstA1 : A1 = (a:1;b:1;c:1);
               KonstA2 : A2 = (a:1;b:1;c:1;d:1);
               KonstA3 : A3 = (a:1);
               KonstA4 : A4 = (a:1;b:1;c:1;g:1;h:1;i:1);

     Pstup ke slokm 

     Ke slokm objektu je pstup zprostedkovn tekovou
notac. A to jak k polokm, tak k metodm. Syntaxe:

     <pstup k poloce> ::= <id. typu object> . <id. poloky>

     <pstup k metod>  ::= <id. typu object> . <id. metody>

     Pracujeme-li s vce slokami jednoho objektu, je vhodn
pout pkaz with (viz 3.2.5). V pkazu with meme pracovat
samozejm s polokami prefixu i podobjektu.

     Metodika pouit

     V pedchzejcm textu jsme se snaili ukzat vhody novho
datovho typu object oproti typu zznam pi vytven datovch
struktur. Zmnili jsme se o vhodch syntaktickho spojen
metod a poloek a o vznamu hierarchizace. Strun jsme
srovnali typ object a zznam.

     Nyn si nartneme nkter zsady prce s objekty, pestoe
podrobn vklad najdete v kapitole 6.4:
-  Poloky objektu by mly bt aktualizovny pouze pomoc
   metod. To znamen vyhbat se pmm operacm s polokami
   objektu.
-  Objekty je vhodn deklarovat v unit jako celek tvoc
   urit modul a v programu u jen vyuvat vlastnosti modulu
   a operace pro nj definovan. Hlavn program tm
   zpehlednte a zkrtte.

     S povdnm o objektech se rozloume pkladem z geometrie:

     type Parametr = array [1..3] of real;
            Teleso = object
                               Tvar : (Hranol, Jehlan, Valec, Kuzel, Koule,
                                             Elipsoid);
                               Param : Parametr;
                               procedure Init(var T : Teleso);
                               procedure Aktualizace(var T : Teleso;
                                                             var P : Parametr);
                          end;
            RotacniTeleso = objekt(Teleso)
                               Zobraz : boolean;
                               Meritko : byte;
                               function Objem : real;
                               procedure Graf(P:Parametr; velikost:byte);
                          end;

Pro ilustraci uvedeme jen funkci Objem (viz 3.4):

     function RotacniTeleso.Objem : real;
     begin
          case Tvar of
               Valec : Objem:=Param[1]*Param[2];
               Kuzel : Objem:=Param[1]*Param[2]/3;
               Koule : Objem:=P.........?


Pomoc soubor lze tak ovldat periferie
jako je obrazovka, klvesnice a tiskrna, atd.) jsou soubory
jednotlivch typ velice podrobn probrny v kapitole 5 (zpsob
uloen, standardn funkce a procedury, vztah typu soubor k
fyzickmu souboru,...).

2.5. Procedury a funkce jako promnn

     V PurePascalu 5.0 meme deklarovat promnn typu
podprogram. Je to dal rozen standardnho Pascalu. Nyn
popeme syntaxi, piem se budeme odvolvat na kapitolu 3, v
n je pesn popis podprogram:

     <popis typu podprogram> ::= 
          - procedure <formln parametry>
          - function  <formln parametry> : <id. typu>

                                                         Ŀ
   <formln parametry> ::=  ( <deklarace parametr>;... ) 
                                                         
                                Ŀ                     Ŀ
   <deklarace parametr> ::=  var  <id.>,... : <id. typu>
                                                     


     Jak vidte, neme bt v popisu typu podprogram typ
destructor nebo constructor. V tomto odstavci budeme tedy slovo
podprogram chpat jako proceduru nebo funkci.

     Oproti deklaraci hlaviky podprogramu se li popis typu
podprogram v tom, e chyb identifiktor podprogramu. Promnn
typu podprogram je uren typem parametr, zpsobem voln,
jejich poadm, eventuln typem vsledku v ppad funkc.
Jmna parametr nejsou dleit.

     Meme si nyn deklarovat napklad typy:

     type Func = function : integer;
            SpecFunc = function (x : real) : real;
            MyProc = procedure (s : string; var x,y,z : byte);

     V popisu typu podprogram jsme vzni pravidly pro popis
formlnch parametr stejn jako pi popisu podprogramu.

     Po deklaraci typu podrogram meme pistoupit k deklaraci
konstant typu podprogram. Konstantou me bt kad podprogram
deklarovan v deklaran sti hlavnho programu nebo unity s
tmito omezenmi:
     -pepna mus bt nastaven do stavu {$F+}, tj. podprogram
      mus bt voln jako FAR
     -neme to bt standardn podprogram
     -neme to bt vnoen podprogram, tj. podprogram
      deklarovan v jinm podprogramu
     -neme to bt inline procedura nebo funkce
     -neme to bt interrupt procedura nebo funkce

     Pro zajitn prvnho bodu doporuujeme explicitn v
programu uvdt direktivu pro peklad {$F+}.

     Promnn typu podprogram je uloena jako adresa vstupnho
bodu danho podprogramu, tedy jako dv slova , kde v dolnm
slovu je uloen offset adresy a segment je v hornm slovu.

     Na ukzku si uvedeme jednoduch pklad deklarace typ a
promnnch typu podprogram a pklady prce s promnnmi,
tebae tm pedbhme do 3.kapitoly:
{$F+} 
program Podprogramy; 
type 
   SpecFunc = function (x:real) : real; 
   GenProc  = procedure (x:real;var s:string); 
   Seznam   = array [1..5] of SpecFunc; 
   zaznam   = record 
                 parametr : real; 
                 alfa     : real; 
                 F        : SpecFunc; 
                 P        : GenProc; 
              end; 
var SF : SpecFunc; 
    GP : GenProc; 
    s1 : seznam; 
    z1 : zaznam; 

procedure GEPR(x:real; var hlaseni : string); 
begin 
   if x>1.96 then hlaseni:='Signifikantni vysledek' 
   else hlaseni:='Nevyznamny vysledek'; 
end; 

begin     { hlavn st programu }
     ...
   GP:=GEPR; 
   s1[3]:=SF; 
   z1.p:=GP; 
     ...
end.
{$F-}

     Jet k tomuto pkladu poznamenejme, e po piazen
procedury GEPR promnn GP d  GP (x,s)  stejn vsledek jako  
     GEPR(x,s), kde samozejm x je typu real a s typu string.

     Promnn typu podprogram jsou dleit pro modulrn
programovn, protoe pesn tvar podprogramu v modulu je mon
specifikovat pozdji (napklad tvar chybovho hlen,
definice matematick funkce pro modul potajc teba
integrl, atd.). Dle se pouvaj pi simulacch, napklad
generovn nhodnch  sel jedinou funkc, jej tvar meme
snadno mnit podle poadovanho statistickho rozdlen.

     Otzky a cvien

 1. Co je to typ?
 2. Zformulujte pravidla deklarace konstant, promnnch a typ.
 3. Existuj njak omezen ve zmnnch deklaracch?
 4. Popite jednoduch typy - rozsah, zpsob uloen, konstan-
    ty, funkce a pklady pouit.
 5. Jak se li typ ukazatel od pointeru?
 6. Vyjmenujte funkce nad ordinlnmi typy. 
 7. Popite vtov typ a typ interval.
 8. Je nsledujc deklarace sprvn?

          type Vrcholy = (A,B,C,D,E,F);
                 Ctverec = (A,B,C,D);

 9. Popite typ pole, uvete rozdly mezi etzci a znakovmi 
      etzci.
10. Kdy pouijete typu zznam? 
11. Definujte variantn st zznamu a uvete pklad.
12. Jak se li zznam od objektu?
13. Jak znte zkladn vlastnosti objekt?
14. Popite typ objekt, vymyslete vhodn pklad pouit obje-
    ktu.
15. V em je zkladn rozdl mezi souborem a ostatnmi typy? 
16. Deklarujte promnnou typu funkce, kter m vstupn para- 
      metry x,y,z typu real volan hodnotou a vstupem funkce je 
    hodnota typu word.3. PKAZY

     V pedchoz kapitole jsme se seznmili s jednotlivmi
datovmi typy a se zpsobem jejich deklarace. Umme ji
deklarovat vlastn typ pkazem type, konstanty jednotlivch
typ pkazem const a konen i jednotliv promnn pkazem
var. Mme tedy pipravenou pdu pro tvorbu vlastnho algoritmu.

     V tto kapitole se budeme zabvat piazovnm hodnot
promnnm a typovou kontrolou. Probereme jednotliv dc
pkazy jazyka (vtven, cykly, skoky). Kapitolu zakonme
vodem do pouvn procedur a funkc.

     Abychom mohli provdt njak operace s daty, je poteba mt
jistou zsobu pkaz. Popime, co to je pkaz po syntaktick
strnce:

     <pkaz> ::=   - <pkaz s nvtm>
                              - <piazovac pkaz>
                              - <przdn pkaz>
                              - <sloen pkaz>
                              - <IF>
                              - <CASE>
                              - <WHILE>
                              - <REPEAT>
                              - <FOR>
                              - <GOTO>
                              - <WITH>
                              - <voln procedury>
                              - <INLINE>

     Vznam a innost jednotlivch typ pkaz probereme v tto
kapitole, a na poloku INLINE, kterou vysvtlme v odstavci
7.6.1.

3.1. Piazovac pkaz

     Piazovac pkaz je "du" vech procedurlnch
programovacch jazyk. Probereme jej velmi podrobn.

3.1.1. Vrazy

     Pojem vraz

     Vraz je zpis, kter reprezentuje njakou hodnotu (pesnji
algoritmus jejho vpotu). Toliko obecn definice. V
programovacch jazycch je slovo "zpis" nahrazovno psnmi
pravidly pro tvorbu jednotlivch vraz. Tak je tomu i v Pure
Pascalu. Tato pravidla popeme v dalm odstavci.

   Nyn se podvejme na vlastnosti vrazu. Podle definice mus
kad vraz reprezentovat njakou hodnotu, kter me bt
konstantn nebo zvisl na hodnot uritch promnnch. Toto
rozdlen je pro peklada dleit, nebo automaticky
propotv hodnotu vech konstantnch vraz (operace mezi
nimi a standardn funkce nad nimi) ji v dob pekladu.
Zrychluje se tm vlastn bh programu.

     Pro ns plyne pouen: "Nebojme se rozepisovat jednotliv
konstanty tak, jak byly vypoteny! itelnost programu za to
stoj a na rychlosti bhu se to neprojev."

     Druhou vlastnost vrazu, kter je v definici ukryta mezi
dky, je typ vrazu. Typ vrazu je obdobn pojem jako typ
promnn. Typ tedy uruje mnoinu hodnot, kterch me dan
vraz nabvat. Pravidla pro uren typu vrazu jsou vak trochu
sloitj, a tak je nechme na konec povdn o vrazech.

     Syntaktick zpis promnn 

     Pojem promnn je nm ji znm. Vme, e m typ a hodnotu.
Umme se na ni odvolat jejm identifiktorem. Jazyk Pure
Pascal vak umouje dal zpsoby odkazu na promnnou. Jejich
syntaktick zpis je tento:

          <promnn> ::= - <id. promnn>
                     - <id. typu> ( <promnn> )
                     - <voln funkce typu ukazatel> ^
                     - <promnn> [ <vraz> ,... ]
                                   - <promnn> . <id. poloky>
                     - <promnn typu ukazatel> ^

     Rozeberme vznam jednotlivch zpis:

-  Identifiktor promnn je prost odkaz na promnnou
   oznaenou tmto identifiktorem.
-  Druh dek popisuje mechanismus petypovn, o nm si
   budeme povdat v kapitole 6.3.3.
-  Na promnnou me bt odkzno funkc typu ukazatel.
-  tvrt dek popisuje pstup k polokm pole.
-  Tekov notace popsan v ptm dku se pouv pro
   zpstupnn poloek zznam, objekt a analogicky i unit
   (tzv. KVALIFIKACE poloek).
-  Znak "^" zpstupuje promnnou, na ni odkazuje uveden
   ukazatel.

     Uveme nkolik pklad:
          var 
               a:array [1..10] of byte;
             b:array [1..10,byte] of ^byte;
               r:record
                    x:byte;
                    y:^char;
                    c:char;
                 end;
          Promnn:
         a          a[x]           b[1,a[x]] r.x       r.y  r.y^
               byte(r.c)      char(b[r.x,byte(r.y^)]^) 

     Syntaktick zpis vraz

     Na tomto mst popeme pesn syntaktick pravidla tvorby
vraz a jejich typ:

          <vraz> ::= - <promnn>
                              - <konstantn vraz>
                              - <unrn opertor> <vraz>
                              - @ <promnn>
                              - @ <id. podprogramu>
                              - <vraz> <binrn opertor> <vraz>
                              - ( <vraz> )
                              - <voln funkce>
                              - <id. typu> ( <vraz> )
                                        Ŀ
                  - [ <vraz>  .. <vraz>  ,... ]
                                        

     Rozebereme vznam jednotlivch zpis:

-  Promnn m hodnotu, kterou naposledy zskala nkterm ze
   zpsob popsanch v nsledujcm odstavci. Typ promnn
   plyne z jej deklarace.

-  Konstantn vraz, jak ji vme z minul kapitoly, je vraz
   sloen z konstant. Konstanta me bt peddefinovan (NIL,
   TRUE, FALSE, []), nebo definovan programtorem v deklaraci
   konstant nebo v deklaraci vtovho typu, nebo pmo
   konstanta zapsan jako literl (nap. 0, 'A', 256.15, 77.5E-
   04, 'Ahoj'). Hodnota konstanty je zejm. Typ konstanty
   obvykle plyne z tvaru zpisu konstanty ('A'-Char, 'Ahoj'-
   String). Vjimkou jsou numerick konstanty. Typ numerick
   konstanty, nen-li formou typovan konstanty eeno jinak,
   je vdy ten typ, kter je "nejmen" z typ, kter danou
   konstantu mohou obsahovat. Pro tento el lze numerick typy
   uspodat takto: shortint, byte, integer, word, longint,
   real. Je-li pouit koprocesor, jsou vechny reln
   konstanty uloeny jako extended.

-  Unrn opertory jsou v Pure Pascalu ti:

           <unrn opertor> ::= +  -  NOT

   Opertor "@" je uveden pro sv vsadn postaven samostatn.
   Prvni dva pracuj s numerickmi vrazy ve zejmm smyslu a
   zachovvaj pitom typ operandu. Je-li typ operandu byte
   nebo word a unrnm opertorem je "-", je vsledek typu
   shortint nebo integer. Opertor NOT zachovv typ operandu a
   pracuje bu s vrazy typu boolean a provd negaci pvodn
   logick hodnoty vrazu, nebo s celoselnmi vrazy a pot
   neguje jednotliv bity v jejich bitov reprezentaci.

-  Unrn opertor "@" vydv adresu uveden promnn, resp.
   adresu vstupnho bodu uvedenho podprogramu. Vsledek je
   typu pointer. Tento opertor nen mono aplikovat na
   libovoln vraz.

-  Binrnmi opertory se budeme podrobn zabvat v dalm
   odstavci.

-  Vloenm vrazu do zvorek se jeho hodnota ani typ nezmn.
   Zvorky se pouvaj podobn jako v matematice k
   uzvorkovn vraz, kter maj bt vypotny nejdve.
   Poet zvorkovch rovn me bt v kadm vrazu libovoln,
   piem k uzvorkovn lze pouvat pouze kulatch zvorek.
   Napklad:   
     (((sin(x) div (360/PI mod 2 - 1) + 5) * 13 - 1) mod 7)

-  Identifiktor typu ped uzvorkovanm vrazem oznauje 
   petypovn podobn jako u petypovn promnnch. Typ
   vsledku je roven petypovvacmu typu. Hodnota vsledku je
   rovna hodnot pslun bitov reprezentaci pvodnho obsahu
   vrazu, pokud se na ni dvme jako na hodnotu petypovanho
   typu. POZOR! Bitov reprezentace typu pvodnho vrazu a
   typu vnucenho mus bt stejn dlouh nebo oba mus bt
   ordinln. Napklad:
           var i:shortint; begin i:=-1; write( byte(i) ) end.
   vytiskne 255. Pouitm petypovn a opertoru @ se budeme
   podrobnji zabvat v kapitole 6.3.

-  Posledn zpis vrazu popisuje vraz typu mnoina. Vechny
   vrazy uvnit zvorek mus bt tho typu, kter me bt
   bzovm typem mnoiny. Typ vsledku je tedy mnoina danho
   bzovho typu. Hodnotou je mnoina obsahujc prvky obsaen
   ve vtu buto pmo nebo formou intervalu jako u konstant
   typu mnoina. Napklad: [1, 7, 9..sqr(12), ord(255)-1].

     Gratuluji k pevnm nervm tm, co nepeskoili ani kousek
vkladu vznam jednotlivch zpis vraz.  

     Binrn opertory

     Jednou z forem tvorby vraz je zpis "<vraz> <binrn
opertor> <vraz>". Pure Pascal obsahuje tyto binrn
opertory:

     <binrn opertor> ::= *  /  and  div  mod  shl  shr 

                      +  -  or  xor  <  >  =  <=  >=  <>  in


     Dve ne zaneme diskutovat jednotliv opertory, eknme
si nco o aritmetice (operace nad celmi a relnmi sly). 
     Jak ji vme, celoseln konstanty jsou uloeny v bytu,
slov nebo dvouslov a reln konstanty jsou uloeny v 6 nebo
10 bytech, podle stavu pepnae {$N?}.

     Jak jsou uloeny mezivsledky? Podle pravidla "vtho
operandu":
-  Je-li alespo jeden operand reln (real, single,double,
   extended), je vsledek operace opt reln slo uloen na
   6 nebo 10 byt (podle stavu {$N?}).
-  Jsou-li oba opertory celoseln, piem alespo jeden z
   nich je promnn (nebo nekonstantn vraz) a alespo jeden z
   nich je typu longint, je vsledek operace tak typu longint.
-  Jde-li o konstantn vraz, je vypoten v potebnm rozsahu
   mezivsledku.
-  Ve vech ostatnch ppadech je vsledek operace uloen jako
   slovo (typ word a integer se rozli a pi dalm pouit).
   Tato skutenost mnoh zasko, nebo program:
          var x:word; begin x:=40000; writeln(40000+x) end;
   vytiskne slo 14464. een tohoto problmu je velmi
   jednoduch, sta jeden z operand petypovat na longint.
   Nap.:
          var x:word; begin x:=40000; writeln(40000+longint(x))
                              end;
     Nyn bude vsledkem oekvanch 80000.

     Nyn strun popime jednotliv binrn opertory:


     Opertory nsoben: * / div mod shl shr and.

          *- typ mnoina = prnik. Vsledkem je mnoina tho
            bzovho typu obsahujc pouze ty prvky, kter jsou
            obsaeny v obou operandech souasn.
               - seln typ = nsoben
          /    - reln typy = dlen (vsledek je typu real)
          div, mod - celoseln typy = celoseln dlen a zbytek
         po dlen. Vsledek je celoselnho typu a tak oba
         operandy mus bt celoselnho typu. Pesn
         algoritmus pro tyto operandy je tento:
                    x div y = (trunc(abs(x/y))*sgn(x/y)),  pro y<>0
                    x mod y = x - (x div y) * y,           pro y<>0
          shl, shr - celoseln typy = posun bitov reprezentace o
         N bit vlevo, resp. vpravo. Oba operandy mus bt
         celoseln a typ vsledku je shodn s prvnm
         operandem. Pesn algoritmus pro tyto operace je
         tento:
                    x sh? n = posune bitovou reprezentaci sla x o N
               bit, piem jako N bere doln byte sla n
               chpan jako typu byte. Petekl bity se
               ztrcej.
          and - typ boolean = logick konjunkce. Vsledkem je true,
               pouze tehdy, jsou-li oba operandy tak true.
                - celoseln typ = logick konjunkce bitov repre
zentace obou celoselnch operand. Je-li jeden z operand
krat, je doplnn zleva nulami. Vsledek je brn jako kladn
slo.


     Opertory stn: + - or xor

          +- typ mnoina = sjednocen. Vsledkem je mnoina tho
            bzovho typu obsahujc vechny prvky, obsaen v
            obou operandech dohromady.
               - seln typ = stn
               - typ etzec = zetzen. Vsledek je typu string a
               je spojenm obou etzc (Nap.: 'Ma'+'ma'='Mama').
            Je-li vsledek del ne 255 znak, je na tuto
            dlku zprava oznut.
          -    - typ mnoina = rozdl mnoin. Vsledkem je mnoina
               tho bzovho typu obsahujc prvky z levho
            operandu, kter nejsou obsaeny v operandu pravm.
               - seln typ = odtn
          or - typ boolean = logick alternativa. Vsledkem je
                    true,je-li hodnota alespo jednoho operandu true.
               - celoseln typ = logick alternativa na bitov
            reprezentaci (viz and)
          xor - exluzive "or" (nonekvivalence). Vsledek je true,
               je-li prv jeden operand true. Analogicky i pro
            bitovou reprezentaci.

     Relan opertory: <  >  <=  >=  =  <>  in                  

    Ŀ  
     Opertor   ordinln a    typ     typ       typ   
                reln typy   boolean mnoina pointer a
                typ string      **)           ukazatel 
    Ĵ
        <          men     not <=   podmno.    -    
        >          vt     not =>   nadmno.    -    
        <=      men rovno     =>   nevl.podm    -    
        >=      vt rovno    <=    nevl.nadm    -    
        =          rovno       <=>     rovno   rovno *)
        <>        nerovno    not <=>  nerovno  nerovno 
        in           -          -     nle      -    
    
          Vsledek relanch opertor je vdy typu boolean.
   *) Adresa obsaen v pointeru nebo v ukazateli se vdy
      porovnv jako segment a offset oddlen (viz 3.4.7).
      Pure Pascal vechny vytvoen pointery (New, GetMem, @)
      normalizuje, a tak pi bn prci probh porovnn
      sprvn. Pracujeme-li ale s nenormalizovanmi pointery
      (nap. funkce PTR), musme bt pi porovnvn velmi
      opatrn a adresu vdy radji normalizovat.
     **) Vimnme si, e opertor <= je vlastn opertorem
      implikace, podobn i opertor = reprezentuje ekvivalenci.
     Zvltn pozornost si na tomto mst zaslou tento pklad:
                    var a,b:function :byte;    ... 
                    begin ...
                         if a=b then ... { Jde o porovnn hodnot typu   
                              byte. }
                         if @a=@b then...{ Jde o porovnn adres funkc.}
                    end;
     dnho zkuenho programtora asi nepekvap skutenost, e
      porovnn dvou relnch sel rznch typ nemus dt
      oekvan vsledek, nap.:
                    var x : single; y : double;
                    begin x:=1/3; y:=1/3;
                              writeln(x=y);   { Vytiskne "FALSE" }
                    end.
     Vimnme si, e nelze porovnvat promnn typu soubor, pole,
      zznam, objekt a podprogram ani na rovnost a nerovnost.

     Na zvr jet pipomeme, e tam, kde me bt operandem
etzec, me bt i etzec znak nebo char a tam, kde me bt
operandem reln slo, me bt i vraz celoselnho typu.

     Priorita opertor

     V Pure Pascalu se vrazy vyhodnocuj podle priorit
opertor. Poad jednotlivch priorit je nsledujc:

          1. Unrn opertory
          2. Opertory nsoben
          3. Opertory stn
          4. Relan opertory

     Dsledkem toho je tato velmi ast chyba:
15 > x  or  7 < y  - nejprve se vyhodnot (x or 7), vsledek je
celoselnho typu; pot se vyhodnot 15 > (x or 7), vsledek
je typu boolean a pi pokusu vyhodnotit (15 > (x or 7)) < y
dojde k chyb, nebo porovnvan operandy nejsou tho typu.
Podobn vrazy je teba pst takto: (15 > x) or (7 < y). Stejn
tak je teba zvorkovat i relace s opertorem nleen.

     Chceme-li tedy zmnit poad vyhodnocovn jednotlivch
vraz, musme pouvat kulatch zvorek.

     Nsledujc vty rychle zapomete, nebo programy, kter by
vyuvaly nsledujc fakta, bych nenechal lutit ani sv
hlavn neptele.
     Jednotliv vrazy se vyhodnocuj takto:
-  Postupuje se vtinou zprava!
-  Vyhodnot se vechny vrazy na nejvy hladin uzvorkovn
   postupn zprava, dokud jsou spojeny opertory stejn
   priority a pot se s nimi provede pslun vpoet.
-  Vjimku tvo logick vrazy spojen opertory and a or. Je-
   li nastaven pepna Boolean Evaluation na reim Short
   Circuit, vyhodnot se nejprve lev operand (tentokrte ji
   obvykle, tj. zprava, nejde-li opt o and nebo or opertor).
   Je-li o vsledku ji rozhodnuto, (tj. jde o konjunkci a
   vsledek je false nebo jde o alternativu a vsledek je
   true), prav operand se ji NEVYHODNOCUJE! Pokud o vsledku
   rozhodnuto nen, vyhodnot se samozejm i prav operand.
-  Je-li vyhodnocovan promnn typu pole, vyhodnocuj se jej
   indexy zprava.
-  Je-li vyhodnocovno voln funkce, provede se pslun
   voln (tedy vechny funkce se volaj postupn zprava),
   piem skuten parametry funkc se tak vyhodnocuj
   zprava.

     Typy chyb pi vyhodnocovn vraz

     Pi vyhodnocovn vraz nejastji dochz k tmto bhovm
chybm:
-  200 Division by zero =
      Dlen nulou. Pravm operandem jednoho z opertor: /,
      div, mod je "0".
-  201 Range check error =
      Vraz urujc indexy pol nebo pozici v etzci
      pekroil povolen meze. Tato chyba je indikovna pouze v
      ppad, e pepna Range Checking je nastaven na On. V
      opanm ppad k hlen chyby nedojde a me dojt k
      velmi tko indikovateln chyb pi dalm zpracovn,
      nebo je-li zapsno do oblasti mimo ppustn meze, mohou
      tm bt zniena nejen sousedn data, ale i kd programu
      nebo dokonce st operanho systmu. Takov chyba se
      obvykle projev "zatuhnutm potae" nebo hlenm chyby
      na mst, kde k takovto chyb neme nikdy dojt. Mjte
      tedy vdy pi ladn zmnn pepna nastaven na On.
      Uette si spoustu prce! Na Off jej pepnejte a
      tehdy, jste-li si jisti, e program je dobe, nebo potom
      se do vslednho modulu nezaad testy mez, kter bh
      zpomaluj.
-  206 Floating point underflow =
      Podteen reln promnn. Tato chyba vznikne pi
      matematickch operacch s relnmi promnnmi, kdy dky
      chyb pi zaokrouhlovn vznikne z velmi malho
      nenulovho sla slo nula. Tato chyba je indikovna
      pouze u operac pouvajcch koprocesor 6888? s
      nemaskovanou indikac podteen (maskovn tto indikace
      je nastaviteln hardwarovm pepnaem).
-  205 Floating point overflow =
      Hodnota relnho vrazu je vt, ne rozsah reln
      promnn. Poznamenejme, e "podteen" nen indikovno
      jako chyba (s vjimkou chyby 206).
-  207 Invalid floating point operation = 
      Matematick funkce m neppustn operand. K tto chyb
      dojde:   - pi ln(x), je-li x<=0
               - pi sqrt(x), je-li x<0
                         - pi trunc(x) a round(x), je-li |x| pli
                           velk
                         - pi peteen zsobnku koprocesoru 6888?.
-  Nejnepjemnj je celoseln peteen. Jde o chybu, kdy
   celoseln vraz (obvykle st vrazu, kter m bt
   operandem) m hodnotu vt ne je rozsah word nebo longint
   (podle toho, jsou-li operandy typu longint nebo krat).
   Tato chyba NEN HLENA a vsledkem jsou pslun doln
   byty oekvanho vsledku, a to bez ohledu na nastaven
   Range check error nebo jinch pepna.
      Pklad: 
               var   a:byte;             var   a:word;
               begin a:=100;             begin a:=100;
                     a:=a*a*a div a;           a:=a*a*a div a; 
                   write(a);                   write(a);
               end.                      end.
                     V obou ppadech se vytiskne 169.
-  Chyba samozejm me vzniknout pi voln funkce, pi jejm
   zpracovn nebo pi nvratu parametr. Tmito problmy se
   budeme podrobnji zabvat v odstavci 3.4. 

     Nezmnili jsme se tu jet o chybch pi pekladu. Takovch
chyb me bt velk mnostv (chybjc oddlovae, neznm
identifiktory atd.) a jsou dky integrovanmu systmu velmi
dobe indikovny a kad si s nimi jist dobe porad sm.
     Zde bych se zmnil pouze o jednom typu chyb a to chyb:
-  26 Type Mismatch = Tato chyba se vyskytne vdy, je-li
   operandem vraz neppustnho typu.

3.1.2. Piazovn hodnot

     Jak ji vme, kad promnn m typ a hodnotu. O typu jsme
si povdali v pedchozm odstavci. Zde budeme diskutovat jej
hodnotu.

     Zpsob zskn hodnot

     Kad promnn me zskat hodnotu jednm z nsledujcch
pti zpsob:
-    Piazovacm pkazem (viz dle).
-    Pkazy vstupu (read, blockread,... ) (viz kapitola 5).
-  Je-li skutenm parametrem podprogramu volanm odkazem (viz
   3.4).
-  Je-li dc promnnou cyklu (viz 3.2.3).
-    Naplnnm jej bitov reprezentace (viz dle).

     Bitov reprezentace promnnch

     Kad promnn m v pamti vyhrazeno msto urit dlky.
Hodnota promnn je urena na zklad obsahu tohoto seku
pamti, tzv. bitov reprezentace, a na zklad typu promnn.
     V pedchozm odstavci jsme popsali pt zpsob, jak lze
obsah pamti vyhrazen promnn aktualizovat. Prvn tyi
zpsoby jsou standardn (popsny v norm jazyka Pascal) a
budeme se jimi zabvat pozdji. Pt zpsob zahrnuje vechny
dal zpsoby, ktermi lze tento obsah aktualizovat. Rozeberme
pt typickch situac:


     Nejprve ten nejjednodu ppad: "Hodnota nebyla
inicializovna". V tomto ppad nen hodnota promnn
definovna. Pi prci s takovouto promnnou NEN HLENA
CHYBA!!! Je to koda, a tak pi programovn muste o to
pelivji dbt na to, abyste kadou promnnou ped prvnm
pouitm naplnili njakou hodnotou. Dvodem k nehlen
platnosti dat je fakt, e Pure Pascal, jak dle uvidme,
umouje naplnit data velmi nestandardnm zpsobem, co v
pokroilch aplikacch (viz kapitoly 6 a 7) me bt velmi
vhodn, ale pro peklada prakticky nezjistiteln bez velkch
asovch nebo syntaktickch komplikac.

     Opt jeden odstavec k zapomenut, aneb: "Co tam tedy je?"
Pi sputn programu je cel pam vyhrazen pro dan program
(rozum se pam nevyuit pro kd programu) naplnn nulami
($00). To tak plat pi odstartovn Pure Pascalu a tedy i
pi sputn prvnho bhu Vaeho programu v integrovanm
systmu. Spustte-li zde program znovu, nebo spustte-li
program jin, zstanou v pamti ty daje, kter na pslunch
adresch byly v okamiku ukonen minulho programu. 
     Ponkud "ist" je tet zpsob inicializace promnnch,
pomoc procedurou FillChar nebo Move (viz 6.3.2).

     V Pure Pascalu lze v programu zapsat data pmo do pamti
na uritou adresu (viz 7.7), tento zpsob je ji velmi
nestandardn a tak riskantn a pro jeho pouit ji mus
existovat pdn dvod.

     Nejbnj nestandardn operac je vak chyba. K t me
dojt z rznch pin. Vyjmenujme pouze ty zkladn:
-    Zpis do pole s indexem mimo jeho meze.
-  Voln podprogramu s formlnm parametrem typu etzec
   volanm odkazem, piem skuten parametr m men velikost
   neli parametr formln. Opt je pekoprovna pln velikost
   delho etzce, m se zni sousedn st pamti. (viz
   3.4.3).
-  Prce s neinicializovanmi ukazateli nebo s ukazateli
   obsahujcmi nil (viz 6.1).
-  Petypovn dynamickch promnnch ukazatelem na typ s jinou
   dlkou (viz 6.3.3).

     Piazovac pkaz

     Zkladn zpsob, jak me promnn zskat platnou hodnotu,
je pouit piazovacho pkazu, je to prvn pkaz, se kterm
se setkvme a m tuto syntaxi:

          <piazovac pkaz> ::= <promnn> := <vraz>

     Pi provdn tohoto pkazu se postupuje takto:
-    Vyhodnot se vraz na prav stran (viz 3.1.1).
-  Vyhodnot se adresa promnn na lev stran (pi
   vyhodnocovn adresy se postupuje obdobn jako pi
   vyhodnocovn vraz).
-  Provede se piazen hodnoty vrazu do promnn. Algoritmus
   piazovn je zvisl na typu vrazu a promnn a bude
   popsn dle. Nejastji se jedn o prostou kopii bitovch
   reprezentac.

     Piazovat lze pouze data "odpovdajcch typ". Nen mon
piazovat logick promnn slo a podobn.
     Pravidla pro to, kter data lze piazovat a kter ne, jsou
vyjdena pojmem "typy kompatibiln vzhledem k piazen":
Vraz typu T2 lze piadit do promnn typu T1 prv tehdy,
kdy typ T1 je kompatibiln vzhledem k piazen s typem T2.

     Kompatibilita typ

     aneb povdn pln definic.

     Typy T1 a T2 jsou identick, jsou-li bu
-  nazvny stejnm identifiktorem (i,j:byte; k,l:byte), nebo
-  jejich nzvy jsou pejmenovnm identickch typ  ( type    
    a=byte; var x:byte; y:a {x & y jsou identickch typ} )

     Typy se stejnm popisem, ale oddlenou deklarac identick
nejsou (nap. a:set of char; b:set of char; ... a - b nejsou
promnn identickch typ).

     Typy T1 a T2 jsou kompatibiln, plat-li jedna z monost:
-    Typy T1 a T2 jsou identick.
-  T1 a T2 jsou reln typy.
-  T1 a T2 jsou celoselnho typu.
-  T1 a T2 jsou intervaly tho typu (jeden interval je
   podinterval druhho intervalu nebo oba intervaly jsou
   podintervaly tho [bzovho] typu).
-  T1 a T2 jsou mnoiny kompatibilnch typ.
-  T1 a T2 jsou znakov etzce te dlky.
-  Jeden z typ je pointer a druh njak ukazatel.
-  T1 a T2 jsou typu procedura se stejnm typem vsledku (jde-
   li o funkci) a stejnm potem a typem parametr.

     Poznamenejme, e v definici identickch a kompatibilnch
typ nezle na poad typ T1 a T2 (Pojmy jsou reflexivn). 

     Typ T1 je kompatibiln vzhledem k piazen s typem T2 (lze
pst "T1:=T2"), plat-li jedna z monost:
-  T1 a T2 jsou kompatibiln typy, rzn od typu soubor.
   Hodnota vrazu typu T2 mus spadat do rozsahu typu T1 (jde-
   li o ordinln nebo reln promnn; resp. jde-li o mnoinu,
   mus vechny prvky  mnoinovho vrazu typu T2 spadat do
   rozsahu bzovho typu mnoiny T1)
-  T1 je reln typ a T2 je celoseln typ.
-  T1 a T2 jsou promnn typu etzec.
-  T1 je typu etzec a T2 je typu char.
-  T1 je typu etzec a T2 je typu etzec znak.
-  T2 je podobjekt objektu T1.
-    T2 je ukazatel na podobjekt bzovho typu ukazatele T1.

     Tato definice ji zejm reflexivn nen.

     Popime nyn metody vlastnho piazovn:
-  Jde-li o identick typy nebo kompatibiln ukazatele,
   kopruj se jejich bitov reprezentace.
-  U kompatibilnch typ nebo u piazen "real:=integer", kdy
   je poteba upravit bitovou reprezentaci nebo posunout meze
   interval, je algoritmus sloitj, ale vsledkem je vdy
   hodnota, kterou jsme "oekvali". Poznamenejme, e pi
   ukldn relnch sel do promnn typu comp je jejich
   hodnota automaticky zaokrouhlena na cel sla.
-  Piazujeme-li do etzcov promnn jin etzec, znak nebo
   znakov etzec, pevede se nejprve znak na jednoznakov
   etzec, znakov etzec na etzec a pot se postupuje
   takto:
     -    je-li piazovan etzec del, je ZPRAVA zkrcen
     -je-li piazovan etzec krat, je zkoprovna jeho
      bitov reprezentace, tj. vsledkem je krat etzec
     -jsou-li oba etzce stejn dlouh, zkopruje se bitov
      reprezentace
-  Pi piazovn podobjekt se kopruj pouze ty poloky,
   kter obsahuje i prefix podobjektu.

     Tato st vkladu byla dosti nron, ale velmi dleit!
Chcete-li se stt odbornky na Pascal, muste tyto definice
bezvadn znt... (P.S. J si je taky nepamatuji.)

     Z uvedench definic plynou nsledujc fakta, kter budeme
demonstrovat na pkladech. Pro jednoduchost zpisu nazname  
piazen rovnou typem namsto promnnch tchto typ, kter
by jinak bylo nutno popisovat:

          Lze:      real := integer;
          Nelze:    integer := real;
               een:   integer := TRUNC( real );
                              integer := ROUND( real );
               Poznmka:To plat i o mezivsledcch ve vrazech,
                     zejmna tam, kde je vyadovn celoseln
                     operand.
         Lze:      ^A := pointer;
                         pointer := ^A;
          Nelze:   ^A := ^B;
               een:   pointer := ^B; ^A := pointer;
                              type RA=^A;...^A := RA ( ^B );   (viz 6.3.3)
               Poznmka:Pouit takovhoto petypovn ji
                     vyaduje vn dvod, je to dost
                     nebezpen. Ono samo o sob piazen
                     ukazatel na rzn objekty je velmi
                     nestandardn!

          Lze: set of 1..10 := set of 9..15;
                         'A'..'K'     := 'G'..'R';
               Poznmka:Hodnota vrazu mus bt v rozsahu
                     promnn, pokud tomu tak nen, dojde k
                     chyb 201 Range check error (viz 3.1.1).

          Nelze:    file of char := file of char;
               een:   ^ file of char := ^ file of char;

          Lze:      string := string[5];
                         string[3] := string[5];
                         string[3] := string[2];
                         string[3] := string;

          Lze:      string[3] := array [2..7] of char;
          Nelze:   array [1..3] of char := string[3];
               een:
                              type 
                                   a3 = array [1..3] of char;
                                   Refa = ^a3;
                                   s3 = string [3];
                              var
                                   a : a3;
                                   s : s3;
                                   i : 1..3;
                              begin
                                   s := 'kuk';
                                   { a:=s }
                                        {1. FOR cyklem}
                                        {   for i:=1 to 3 do a[i]:=s[i];}
                                        {2. pkazem MOVE (viz 6.1)}
                                        {   Move(s1,a1,3);}
                                        {3. Petypovn}
                                   {     a:= Refa( @s[1] ) ^;}
                                   writeln( a )
                              end.
               Poznmka:Pokud tomuto tetmu ppadu hned
                     neporozumte, nic se nedje. Je dosti
                     obtn. Jet se k nmu vrtme v 6.
                     kapitole. Toto piazen byste mohli
                     potebovat pouze pi prci se soubory
                     obsahujc znakov etzce (viz kapitola
                     5). V tom ppad tento pklad prost
                     opite...
         Lze:      string := char;
          Nelze:    char := string;
               een:   char := string[1];

          Lze:      procedure (x:byte) := procedure (z:byte);
          Nelze:    procedure (x:byte) := procedure (x,y:byte);
               een:   ^ procedure(x:byte) := ^ procedure(x,y:byte);
               Poznmka:Zde se jedn o voln procedur s rznm
                     potem (nebo i typem!) parametr. Je to
                     operace velmi nestandardn a riskantn.
                     Nebudeme proto toto voln dle rozebrat.
                     innost pi voln takovto procedury bude
                     objasnna v odstavci 3.4.7.

     Nech:   type 
               a  = object
                                   i:byte;
                                end;
                         ra = ^ a;
                         b  = object (a)
                                   j:byte;
                              end;
                         rb = ^ b;
                    var
                         aa : a;
                         raa: ra;
                         bb : b;
                         rbb: rb;

          Lze:      aa := bb;
          Nelze:    bb := aa;
               een:   Pouit ukazatel!
               Poznmka:POZOR! V tomto ppad nelze pout
                     petypovn jako v ppad znakovch
                     etzc, nebo by byl znien obsah pamti
                     za pam vyhrazenou prefixu. Binrn
                     reprezentace podobjektu je o dlku
                     vlastnch poloek podobjektu del neli
                     binrn reprezentace prefixu.

          Lze:      raa := rbb;
          Nelze:    rbb := raa;
               een:   rbb := rb( raa );
               Poznmka:V tomto ppad jde pouze o "kvalifikaci"
                     ukazatele na objekt.

     Uveden problematika je zkladnm stavebnm kamenem prce s
Pure Pascalem. Jej dobr zvldnut Vm uet spoustu asu
pi programovn i pi ten dalch st tto prce.

     Chyby pi piazovn

     Pi zpracovn piazovacho pkazu me dojt k chyb ve
vech tech fzch provdn. Prvn dv fze (vyhodnocen
vrazu a promnn) mohou zpsobit chyby uveden v pedchozm
odstavci.     Fze piazen nejastji zpsob chybu:
-  201 Range check error. Tato chyba me vzniknout za stejnch
      okolnost jako pi vyhodnocovn vrazu, avak pibv
      zde jet monost, kdy hodnota vrazu na prav stran
      pkazu je mimo rozsah (interval) typu promnn na stran
      lev.

3.2. dc pkazy

     V jazyce Pascal se provd jednotliv pkazy za sebou tak,
jak byly zapsny. Jednotliv pkazy se zpracovvaj v
monoprogramovm reimu. Jedinou vjimkou z tchto pravidel je
obsluha peruen, kdy me bt poruena sekvennost vpotu.
Na toto tma si budeme povdat a pozdji (viz 7.6).
     Pro prvn pedstavu tedy chpejme program v Pure Pacalu
jako posloupnost pkaz (sloen pkazy mohou bt dosti
komplikovan) oddlenou stednky.

3.2.1. Zkladn pkazy

     Piazovac pkaz

     S piazovacm pkazem jsme se velmi podrobn zabvali v
pedchozm odstavci. Zde pipomeneme pouze jeho syntaxi:

          <piazovac pkaz> ::= <promnn> := <vraz>

     Przdn pkaz

     Przdn pkaz je pkaz neobsahujc dn znaky. Dsledkem
existence przdnho pkazu je fakt, e stednky "navc" mezi
pkazy nevad, nebo jde o przdn pkazy, kter peklada
nepekld. Syntaxe je tedy:

          <przdn pkaz> ::= 

     Poznamenejme, e podobn situace se vyskytuje i u deklarace
poloek zznamu, kde za posledn polokou me bt ped end
umstn stednk "navc".

     Sloen pkaz

     Mnohdy je poteba v rmci sloitjch dcch struktur
provst vce pkaz tam, kde je povolen jedin pkaz. To lze
vyeit uitm sloenho pkazu, kter pomoc "programovch
zvorek": begin a end dl z posloupnosti pkaz pkaz
jedin. Pesn syntaxe je tato:

          <sloen pkaz> ::= begin   <pkaz>; ...   end

     Sloen pkaz se provd tak, e se postupn vykonaj 
vechny jeho pkazy v uvedenm poad.

     Pozor, neplete si tento pkaz s blokem. Blok se od
sloenho pkazu li tm, e obsahuje i deklaran st a
mechanismus jeho pekladu je mnohem sloitj.
3.2.2. Pkazy vtven

     V kadm programovacm jazyce existuj prostedky pro
vtven programu. V Pascalu to jsou pkazy if a case.

     Pkaz IF

     Chceme-li nkter pkaz provdt pouze za jistch podmnek,
pouijeme pkaz IF. Jeho syntaxe je:
                                                          Ŀ
   <IF> ::= if <logick vraz> then <pkaz>  else <pkaz> 
                                                          
     IF-pkaz pracuje takto:
-  Vyhodnot se logick vraz.
-  Pokud je hodnota true, provede se pkaz za slovem then a
   pot se pokrauje dalmi pkazy za IF-pkazem. Ppadn
   else-vtev se pesko.
-  Pokud je hodnota false, provede se pkaz za slovem else a
   pot se pokrauje dalm pkazem za IF-pkazem. Pokud
   else-vtev chyb, neprovede se dn pkaz a rovnou se
   pokrauje dalm pkazem nsledujcm za pkazem IF. Pi
   hodnot false se vdy pesko then-vtev.

     K syntaxi IF-pkazu musme dodat jet jedno smantick
pravidlo, a to: "Je-li v then-vtvi uveden opt podmnn
pkaz, vztahuje se ppadn else-vtev prv k tomuto
pkazu."
     Toto pravidlo demonstrujme na pklad, kde vztah mezi if--
then-else vyjdme indentac (psanm pod sebe a odsazovnm):

     if a=b then
          if c=d then
               begin
               if e=f then e:=1
               end
          else
               if g=h then g:=2
               else h:=3;

     Vimnte si, e ped slovem else se NEDL stednk. Psan
";" ped else je velmi ast chyba!

     Pkaz CASE

     Chceme-li vtvit program v zvislosti na hodnot njakho
ordinlnho vrazu, meme k tomu pout pkaz CASE:

     <CASE> ::= case <ordinln vraz> of

                              <case-varianta> : <pkaz>  ;...
                               Ŀ
                   else <pkaz> 
                               
                         end

kde:

     <case-varianta> ::= - <konstanta>                     ,...
                                     - <konstanta> .. <konstanta>

     Vimnme si, e zde slovo end ukonuje cel pkaz, akoli
nezan slovem begin, jak tomu obvykle bv.

     Pro sna orientaci uvedeme nejprve nkolik pklad:

     case i of 1 : i:=2;           case b of true : ;
                     2,5..7,12 : i:=1;                 else : b:=true
             else i:=0;            end {case}
   end {case}

     Poznamenejme, e i zde plat "mylenka przdn varianty",
jinmi slovy ped else a ped end me bt stednk "navc".
     dc vraz mus bt ordinlnho typu v rozsahu -32768..
32767. Neme to tedy bt vraz typu word nebo longint. Toto
omezen plat a do verze 5.0. Ve verzi 5.5 ji me bt dc
vraz typu word.
     Pro oznaen variant mus bt pouity pouze KONSTANTY tho
ordinlnho typu, jako je typ dcho vrazu. Kad varianta
je urena seznamem pslunch konstant. Tento seznam je zadn
vtem jednotlivch konstant, piem souvislou adu konstant
lze zapsat formou intervalu. Peklada nekontroluje, je-li
nkter konstanta zadna vcekrt.

     CASE pkaz pracuje takto:
-  Vypote se hodnota ordinlnho vrazu.
-  Prohledv se postupn seznam konstant (intervaly se
   pekldaj jako intervaly a nikoli jako vet konstant),
   dokud nen nalezena varianta oznaen konstantou rovnou
   hodnot vrazu.
-  Nalezne-li se pslun varianta, provede se pkaz, kter
   j odpovd, a po jeho proveden se pokrauje dalm
   pkazem nsledujcm za CASE-pkazem.
-  Nenalezne-li se vhodn varianta, provede se pkaz za else,
   pokud existuje, a pot se pokrauje dalm pkazem.

     Oproti norm Pascalu [WIRTH], [JINOCH] v tomto pkazu
nemus bt pln vet vech konstant, konstanty se mohou
opakovat a me a nemus bt uvedena else-vtev. Pkaz se
pekld jako etzec IF-pkaz, ale s tm rozdlem, e vraz,
kter testujeme, je vyhodnocen pouze jednou.

     ELSEIF

     V mnoha modernch programovacch jazycch ji bylo uputno
od zkostnatlho zpisu pomoc begin - end zvorek. Problmy s
nvaznost jednotlivch else-vtv byly eeny takovouto
strukturou [ADA]:
          if <podmnka>            then <pkaz>
               elseif <podmnka> then <pkaz>  ...
                                             else <pkaz>
          endif
     Tato struktura nen v Pascalu 5.5 implementovan, pestoe
se v mnoha aplikacch asto vyskytuje. Od CASE pkazu se li
zejmna tm, e v jednotlivch podmnkch mohou bt libovoln
vrazy vc se samozejm k rznm promnnm. 
     Tento nedostatek se d snadno napravit vhodnou pravou
podobnch konstrukc. Doporuuji napklad takovto een:

     if a<b then
          begin 
          a:=b;
          b:=b+1
          end
     else if c<d then c:=d
     else if e<f then
          begin
          e:=f;
          f:=0
          end
     {endif}

3.2.3. Pkazy cyklu

     V mnoha programech je poteba provdt nkterou st vpotu
opakovan. K tomu slou pkazy cyklu. V Pure Pascalu jsou
ti typy cykl: while, repeat a for.

     Pkaz WHILE

     Pkaz WHILE m nsledujc syntaxi:

     <WHILE> ::= while <logick vraz> do <pkaz>

     WHILE pkaz pracuje takto:
1. Vvyhodnot logick vraz a pokrauje krokem 2.
2. - Je-li vraz true, provede se uveden pkaz a pokrauje
   znovu krokem 1.
   - Je-li vraz false (a ji pi prvnm nebo n-tm prchodu),
   pkaz se neprovede a vpoet pokrauje dalm pkazem.

     WHILE pkaz nem dn dal omezen.

     Pkaz REPEAT

     Pkaz REPEAT je obdobn jako while, ale m tuto syntaxi:

     <REPEAT> ::= repeat  <pkaz>;...   until <logick vraz>

     REPEAT pkaz pracuje takto:
1. Provede posloupnost pkaz uvnit cyklu a pokrauje druhm
   krokem.
2.   -Vyhodnot se logick vraz.
     -Je-li true, prce pokrauje dalm pkazem.
     -Je-li false, pokrauje krokem 1.

     Vimnme si rozdl mezi obma cykly:
-  V repeat se vdy alespo jednou provede posloupnost pkaz
   cyklu; ve while to bt nemus.
-  V repeat je pmo uvedena posloupnost pkaz, kdeto ve
   while je poteba pout sloenho pkazu.
-  V repeat je logick vraz ukonovac podmnkou ("Dokud
   nen"), kdeto ve while jde o podmnku trvn ("Dokud je").

     Jako pklad uvedeme pevod obou cykl na sebe, nebo jsou
navzjem zastupiteln:

     Uvaujme takovto pkazy:
          while  do ;                      repeat ; ;  until ;
     Lze je pepsat takto:
                                                       ; ; ;
          if  then                          while not  do
               repeat  until not ;         begin ; ;  end;

     ast pouit pkazu repeat je pi vstupu z klvesnice,
nebo na rozdl od WHILE-cyklu nemus bt znm podmnka
ukonen (ten promnn) ped vstupem do cyklu, ale sta,
provedeme-li ten uvnit cyklu.

     Pkaz FOR

     Jedin pkaz cyklu s pevnm potem prchod je pkaz for.
Jeho syntaxe je takovto:

<FOR> ::= - for <promnn>:=<vraz> to     <vraz> do <pkaz>
          - for <promnn>:=<vraz> downto <vraz> do <pkaz>

     Prvn varianta odpovd cyklu se vzrstajc hodnotou dc
promnn cyklu a druh s hodnotou klesajc.
     Promnn a vrazy mus bt tho ORDINLNHO typu. Promnn
mus bt jednoduch promnn bez jakkoli kvalifikace.

     FOR pkaz pracuje takto:
-  Vyhodnot se prav vraz a ulo se do pomocn promnn.
-  Vyhodnot se lev vraz a ulo se do dc promnn cyklu,
   tj. promnn, kter je uvedena za slovem for.
-  Je-li pi to-variant prav vraz men ne lev nebo pi
   downto-variant prav vraz vt ne lev, pokrauje
   vpoet dalmi pkazy.
-  Jinak je proveden uveden pkaz a do dc promnn cyklu
   je piazen jej nslednk (SUCC), resp. pedchdce (PRED).
   Tento pkaz se provd opakovan, dokud nen dc
   promnn rovna pravmu vrazu (ped vstupem do cyklu). Pot
   vpoet pokrauje dalmi pkazy.

     Zmnn algoritmus lze pomoc dve uvedench prostedk
popsat pro ppad: "for i:= to/downto  do ;" takto:

          b:=;
          i:=;
          if ("to" and (i<=b)) or ("downto" and (i>=b)) then
               repeat ;
                if i<>b then
                   if "to" then i:=succ(i) else i:=pred(i)
         until i=b;

     dc promnn se ve standardnm Pascalu nesm mnit uvnit
tla cyklu a mus bt definovna v danm bloku. Ob tyto
podmnky vak nejsou v Pure Pascalu kontrolovny, a tak se
dc promnn me vyskytovat v uvedenm pkazu libovoln,
avak mnit jej hodnotu nedoporuuji. Test ukonen je
provdn na rovnost a v ppad zmny dc promnn bychom
mohli ukonovac hodnotu peskoit a cyklit a cyklit a
cyklit...

     Po ukonen cyklu je hodnota dc promnn nedefinovna,
ve skutenosti je vak rovna pvodn hodnot pravho vrazu.
Tohoto faktu pokud mono tak nevyuvejte, nebo je v zsadnm
rozporu s normou.

     Ukonen cyklu

     V Pascalu nen dn pkaz na pedasn ukonen cyklu. Je
zde sice pkaz exit, ale ten m pln jin vznam (viz 3.4.5).

     Tento nedostatek se e dvma zpsoby:
1)   Pidnm logick dc promnn:
     var konec:boolean;                  var konec:boolean;
     begin konec:=false;                 begin konec:=false;
          while  and not konec do    repeat
               begin ; ; ...                    ; ; ...
                    if  then konec:=true;        if  then konec:=true;
                    ; ...                             ; ...
         end                                    until  or konec
   end.                                            end.

     Poznamenejme, e tuto monost nelze aplikovat na FOR-cyklus.

2) Pomoc pkazu skoku (viz 3.2.4)
          label konec;
          var i:char;
          begin
               for i:='A' to 'Z' do
                    begin  .... ; goto konec; ... end;
               konec:
          end.

     Tato metodika je jednou ze dvou vhodnch pouit pkazu
goto, kter popeme v nsledujcm odstavci. Pkazu goto vak
radji nepouvejte ke skoku "ped" cyklus! Velmi patn se
potom program lad...

3.2.4. Pkaz skoku

     Snad ve vech programovacch jazycch existuje pkaz goto.
m vy rove vak jazyk m, tm mn vhodn je jeho
uvn.
     Dvodem je patn verifikovatelnost program, sniovn
itelnosti a leckdy naruen modularity a strukturovanosti
jazyka.

     V Pascalu je pouit pkazu goto vhodn ve dvou ppadech.
Prvn byl popsn v pedchozm odstavci - pouit goto pi
vskoku z cyklu za jeho konec. Druh ppad je indikace chyby,
po n nehodlme pokraovat ve vpotu. Zde je tak mono
pout pkazu goto ke skoku na konec programu, kde pouze
zahlsme chybu a program ukonme.

     Nvt

     Abychom mohli skoit na njak msto v programu, musme jej
umt oznait. K tomuto oznaen slou nvt:

     <pkaz s nvtm> ::= <id. nvt> : <pkaz>

     Nvt je tedy identifiktor jako kad jin a samozejm
nesm kolidovat s jinmi identifiktory v tme bloku. Oproti
bnm identifiktorm me bt identifiktorem nvt i
libovoln slo z intervalu 0..9999. V bloku, v nm je
deklarovn, mus bt kad identifiktor nvt pouit v
pkazu s nvtm nejve jednou (je-li pouit v pkazu GOTO,
pak mus bt v pkazu s nvtm pouit prv jednou).
     Identifiktor nvt mus bt deklarovn pi deklaraci
nvt v nejvnitnjm bloku (viz 3.4.4). Tvar deklarace
nvt je tento:

     <deklarace nvt> ::= label  <id. nvt>,...  ;

     Doporuuji tuto st deklarac uvdt jako prvn v oddle
deklarac ped deklaracemi konstant, typ a promnnch (jak je
tomu ve standardnm Pascalu).

     Pkaz GOTO

     Vlastn skok je provdn pkazem GOTO:

     <GOTO> ::= goto <id. nvt>

     Po proveden pkazu goto vpoet pokrauje od pkazu s
danm nvtm. Umstn nvt s ohledem na msto, odkud je
na nj "skkno" (me to bt i z vce mst) podlh tmto
omezenm:
-  Nvt mus bt deklarovno v nejvnitnjm bloku. Z toho
   plyne, e nelze "skoit" do podzenho ani sousednho
   podprogramu. "Skoit" lze pouze v rmci bloku.
-  Pkaz GOTO mus bt uveden v tom bloku, v nm je pslun
   nvt deklarovno. Nelze tedy pomoc GOTO vyskoit z
   podprogramu.

     Skok do pkazu

     Pkaz s nvtm nesm bt soust strukturovanho
pkazu. Pokud to vak udlte, nen hlena dn chyba.
Prakticky toho vak nepouvejte, vyvarujete se spousty
problm.

     Pro plnost popime, co se stane pi skoku "do pkazu".
Pjde o ten jen pro ty "skaln", take komu se nechce: "goto
3.2.5".
-  Pi skoku do sloenho pkazu vpoet prost pokrauje od
   danho pkazu. Je-li tento pkaz (stejn jako u dalch
   pkaz) soust jinho strukturovanho pkazu, aplikuj
   se opt tato pravidla v odpovdajc me.
-  Pi skoku do THEN nebo ELSE vtve pkazu IF se provede
   pslun pkaz s nvtm a vpoet pokrauje za pkazem
   IF.
-  Pi skoku do nkter z variant pkazu CASE je provedena
   tato varianta a vpoet pokrauje za pkazem CASE.
-  Pi skoku do tla cyklu WHILE je proveden pslun pkaz
   tla cyklu. Sko se ped cyklus a cel cyklus se zane
   dn zpracovvat.
-  Pi skoku do tla cyklu REPEAT je proveden pslun pkaz
   tla cyklu (resp. jeho pslun st). Dal vpoet
   pokrauje, jako by se do tla vstoupilo normln.
-  Skok do tla cyklu FOR je nejstranj programtorsk
   obrat, kter jazyk pipout. Nedlejte to! innost po
   tomto skoku lze popsat skokem do modelu tohoto pkazu
   popsanho v odstavci 3.2.3.-Pkaz FOR. Uvdomme si, e v
   tomto ppad je hodnota dc promnn zachovna
   "odminule" a v kadm kroku se zvtuje (resp. zmenuje).
   Hodnota ukonovacho vrazu vbec nen definovna a je
   urena nhodnm obsahem pslun bitov reprezentace.
-  Pi skoku do pkazu WITH (viz 3.2.4) se provede pslun
   pkaz pkazu WITH. Problm je vak ten, e nebude naplnn
   bzov registr odkazujc na pslun zznam. Vechny
   identifiktory poloek pot odkazuj kamsi do pamti a
   program pepisujc hodnoty tchto "poloek" me bt velmi
   zajmav...

     Pokud Vs dosavadn zastraovn neodradilo od skok do
pkaz, ukeme, e me bt jet h.
     Zatm jsme si nic nekali o optimalizacch. Napravme to v
oddle 7.9. Zde je vak poteba zdraznit fakt, e peklada
automaticky vyhodnocuje vechny vrazy, u nich to bhem
pekladu jde. Jsou to konstanty - operace s nimi - a
vyhodnocen standardnch funkc nad nimi. Tmto zpsobem si
pedvyhodnot i podmnky u pkaz IF a WHILE. Dojde-li k
zvru, e nkter vtev pkazu IF nebude nikdy pouita ,nebo
e do tla WHILE-cyklu se nikdy nevstoup, pslunou st kdu
prost NEVYTVO.
     Skome-li do takovto IF-vtve nebo WHILE-cyklu, skeme
nkam, kde je ji dvno jin kd a program se chov po svm...
Nejastji zcela "zatuhne".

     Tedy jet jednou: "Pkaz skoku pouvejte pouze pro vskok
tsn za cyklus nebo pro skok na konec bloku!"

3.2.5. Pkaz WITH

     Pracujete-li s polokami zznam, zanedlouho zjistte, e
velmi asto pracujete v jedn sti programu pouze s jednm
zznamem danho typu. Jste stle nuceni vypisovat kvalifikaci
kad poloky, kter me bt mnohdy dosti sloit (nap.     
Ref[x]^.Next^.Info). Je to nevhodn nejen proto, e tuto
kvalifikaci muste stle opisovat, ale tak proto, e se mus
pi bhu programu opakovan vyhodnocovat. Jet markantnj,
je to v ppad, obsahuje-li kvalifikace voln funkc.

     een je v tzv. inspekci. Jde o pouit takovho pkazu,
kter zabezpe vyhodnocen kvalifikace pouze jednou a pouije
ji u vech poloek danho zznamu v rmci pkazu inspekce. V
Pascalu m pkaz inspekce tvar:

     <WITH> ::= with  <vraz typu zznam>,... do <pkaz>

     Tento zpis je vlastn zkratkou za postupnou inspekci, jak
plyne z nsledujcho pkladu:

     with , ,  do                 je tot jako 
   with  do with  do with  do .

     Vysvtleme nejprve jednodu konstrukci s jednm vrazem.
Jako prvn se vyhodnot vraz typu zznam. Jeho vsledek je
interpretovn jako adresa potku zznamu. Tato adresa se ulo
do bzovho registru. Vechny identifiktory, kter jsou v
inspektovanm pkazu pouity a jsou shodn s identifiktory
poloek danho zznamu, jsou chpny jako oznaen tchto
poloek a pi bhu se jejich adresa vyhodnocuje "pouhm
setenm bzovho registru a relativn adresy poloky uvnit
zznamu". Tomuto postupu kme inspekce pkazu. Analogicky
lze hovoit i o inspekci vrazu.

     Co se dje, jde-li o vcensobnou inspekci? Postup je
nsledujc: 
-  Vyhodnot se prvn vraz (). Jeho vsledek je zznam.
-  Prvnm zznamem () je inspektovn druh vraz () a pot je
   tak vyhodnocen.
-  V n-tm kroku je vyhodnocovn n-t vraz (), piem je
   ped tm inspektovn postupn vemi pedchzejcmi zznamy
   ponaje naposled vyhodnocenm (-).
-  Nakonec je inspektovn vlastn pkaz, piem inspekce
   probh od poslednho zznamu. 

     Pi vcensobn inspekci (tak jak je popsna v tetm a
tvrtm bod pedchozho postupu nebo jak k n me dojt
nkolikansobnm pouitm pkazu WITH) plat zsada "Bli
koile ne kabt":
-  Vechny identifiktory jsou postupn prochzeny a, lze-li je
   kvalifikovat tm nejvnitnjm zznamem, jsou
   "kvalifikovny" (pesnji viz ve). Tent postup je
   opakovn pro druh zznam a pro zznamy dal. Cel
   mechanismus si meme pedstavit takto:

     Uvaujme takovto pklad:
          var  X:record a,b,c:byte end;
                    Y:record b,c,d:byte end;
                    Z:record c,d,e:byte end;
      begin with X,Y,Z do a := b + X.c * d - e end;

     Pkaz WITH se bude postupn upravovat takto:
               with X, {X.}Y, {X.}{Y.}Z do a := b + X.c * d - e end;
               with X, Y do a := b + X.c * Z.d - Z.e end;
               with X do a := Y.b + X.c * Z.d - Z.e end;
               X.a := Y.b + X.c * Z.d - Z.e;

     Vimnme si jet tohoto pkladu:
          type X=record a,b:byte end;
          var  a,b:X;
          begin with a,b do b:=b+1 end;
     V tomto ppad dojde k chyb pi pekladu, nebo po
vyhodnocen promnn A se provede inspekce druhho vrazu, tj.
z B se stane A.B, co je promnn typu byte a nikoli zznam.

     Ve verzi 5.5 je pouit pkazu WITH rozeno na inspekci
promnnch typu object. Zpsob prce je pln stejn a ble se
mu budeme vnovat v odstavci 6.4.

3.3. Operace vstupu a vstupu

     V Pure Pascalu je standardn vstupn a vstupn soubor
spojen s klvesnic (INPUT) a monitorem (OUTPUT). V hlavice
programu mohou bt tyto soubory (spolu s dalmi pouitmi
soubory) vyjmenovny. Napklad:

          program PGM ( INPUT, OUTPUT, PRACOVNI );

     Je-li v tomto zpise chyba, je hlena pi pekladu. Tento
seznam je vak, jako cel hlavika, chpn jako koment a me
bt vynechn.
     Doporuuji hlaviku programu nevynechvat, ale pst do n
pouze nzev programu (ten by se ml shodovat se jmnem
pslunho zdrojovho souboru):

          program PGM;  { program je v souboru "PGM.PAS" }

     Vlastn operace vstupu a vstupu jsou realizovny pomoc
procedur read, readln, write, writeln. Procedury read a readln
jsou vstupn a procedury write a writeln vstupn.
     Procedury read, readln a writeln po svm proveden
oddkuj, tj. dal text bude zobrazovn na dal dce
monitoru.
Procedura writeln (i readln) me bt pro el oddkovn i
bez parametr.

     Procedury vstupu mohou mt libovoln poet parametr
tvoench identifiktory promnnch typu: Celoseln typ,
Reln typ, Char a String.
     Procedura readln (na rozdl od read) po peten vstupnch
hodnot pesko vechny znaky a do konce dku, tj. ignoruje
vechny pebyten znaky a do stisknut klvesy ENTER
(vetn). Doporuuji Vm pro vstup z klvesnice upednostovat
pouit procedury readln ped read. Pi vstupu sel jsou
ignorovny vechny vodn mezery a konce dk.

     Obdobn tomu je i u procedur pro vstup. Zde pibv jet
monost vstupu promnnch typu Boolean. Parametry procedur
write a writeln mohou bt vrazy uvedench typ. Za kadm
vrazem me bt dvojteka a celoseln vraz udvajc poet
mst, na kter se dan vstup zobraz. Je-li zobrazovna reln
promnn, me mt jet dal dvojtekov parametr urujc
poet desetinnch mst.

     Uveme nkolik pklad:

     read(a);                 readln(a,x,m); read(f,g,h[i],x.s);
     write('Ahoj':6);    writeln;            write(345.65:7:2);
     writeln('X= ',sqr(a):7);

   Pesnm popisem jednotlivch procedur se budeme zabvat
pozdji (viz kapitoly 5 a 8).

3.4. Podprogramy

     Akoli v souasn dob pomalu pohasn slva
"Strukturovanho programovn" a nahrazuje se novm hitem:
"Modulrnm programovnm", je strukturovanost v pojmu
modularita skryta. O modulrnm programovn si budeme povdat
v kapitole 6. Nyn vak podrobn probereme problematiku
strukturovanho programovn a prci s jeho nejsilnjm
nstrojem - "podprogramy".
     Podprogramy spolupracujc s assemblerem ( direktivy      
external, inline, interrupted) probereme a v kapitole 7, nebo
jejich zpsob pouit se podstatn li od pouit bnch
podprogram.


3.4.1. Strukturovan programovn

     Peme-li program, sname se, aby byl dobe, tj. aby
pracoval tak, jak chceme a aby pitom byl dostaten rychl
(viz [KRYL]).

     Neiteln programy

     Pi dnen rychlosti osobnch pota nen nezbytn, aby
programy byly "co nejrychlej", ale sta nm, jsou-li
"dostaten rychl". Z toho plyne, e etit s asem musme
zejmna pi prci se soubory a pi provdn cykl, kter se
asto opakuj. Oproti tomu spora vznikl co nejvt
optimalizac kdu za cenu jeho itelnosti je velmi
diskutabiln.

     Neitelnost programu se projev zhruba takto: 
-  Proces ladn pjde pomaleji, zdren bude miteln v
   hodinch a to nehovom o ztrtch pi nedodren termnu
   dokonen.
-  Neiteln program obvykle tko pete i sm autor, a tak
   jen zdka kdy me bt vnitn pesvden, e je dobe.
   Tento fakt podlamuje jeho odhodln program ladit a ve svch
   dsledcch vede k astm chybm pi provozovn "hotovho"
   programu a tm i k dalm zdrenm.
-  Neiteln program nem nikdo anci (snad mimo autora)
   pochopit, nato pak upravit. Nikdo ho od Vs nekoup...

     Toto je tedy cena za pr "uetench" milisekund.

     iteln programy

     No dobe, budeme pst iteln. Co to ale znamen?
     O definici se radji pokouet nebudu, ale zhruba eeno je
teba: komentovat, indentovat, vhodn volit identifiktory a
pedevm program strukturalizovat.

     Kad program by ml bt dostaten komentovan. Ped
potkem programu by ml bt popis toho, co program dl, jak
m vstupy a vstupy, kdo je autor, jak program pouv
algoritmy atp. Na osobnch potach se stalo zvykem takovouto
hlaviku dvat do "komentovho rmeku", m se znan
zvrazn. Dle je nutn komentovat innost vech podprogram.
Takov koment je obvykle zapisovn za jej hlaviku. Je
vhodn komentovat vznam jednotlivch pouitch promnnch. U
sloitjch blok programu doporuuji komentovat i jednotliv
kroky algoritmu.

     Program je poteba indentovat, tj. odsazovat ty pkazy,
kter jsou soust sloench pkaz. O kolik a jak, je vc
kadho z ns a pokud zante, podvejte se svm kolegm pes
rameno. Zvyknte si pst na dek vdy nejve jeden pkaz.
Voln dky mezi logickmi bloky algoritmu tak nekod a ve
zvl markantnch ppadech doporuuji i "zbyten" pouit
programovch zvorek begin - end, kter tak oddl logick
sti i fyzicky (zvorky se nepekldaj!).

     Sprvn volba identifiktor je zvl dleit u vtch
systm. Nebojte se pouvat osmi a dvanctiznakov
identifiktory. U sloenin pouvejte buto podtrtka nebo
kad slovo zanejte velkm psmenem (nap.: TopOfStack nebo  
   Stack_Top). Promnn typu ukazatel by mly jako pedponu
nebo pponu obsahovat cosi jako "Ref","Ptr",atp. Kratmi
identifiktory by mly bt oznaeny pomocn promnn a i zde je
dobr zavst konvence jako: i,j,k vyuvat pro promnn typu
integer; c pro char; s pro string atd.

     Strukturovn

     Strukturovanost programu spov zejmna v tvorb procedur.
k se, e dn procedura (ani hlavn program) by nemly bt
del ne 10-20 dek. Nen na zvadu, obsahuje-li procedura
pouze ti dky a vol se jenom jednou. Je-li dobe nazvna,
tj. tak aby jej nzev strun vystihoval jej innost, je
napsna sprvn. Pro? Ty ti dky odlad i zatenk a je si
jist, e jsou dobe. Program, kter vypad napklad takto:

   ...
     begin
          InicializujObrazovku;
          OtevriSoubor(F);
          repeat
               NactiPolozku(F,Zaznam);
               ZpracujPolozku(F,Zaznam);
               ZobrazPolozku(F,Zaznam);
               Cekej(DobaCekani);
          until KonecSouboru(F);
          UzavriSoubor(F);
     end;

by jist lo napsat bez jedin procedury. Byl by o voln
procedur krat a tak rychlej. Byl by vak mn prhledn.
Takto je na prvn pohled jasn kostra algoritmu a jednotliv
procedury nebudou jist moc dlouh a tak je bude mon snadno
zkontrolovat. Takto napsan program bude po odladn "oividn
sprvn".

     Semi Top-Down

     Ji vme, jak m program vypadat, ale jak jej napsat? Mme
naped pst hlavn program nebo procedury? Zaneme-li od
hlavnho programu, jde o metodu zhora; zaneme-li od procedur,
jde o metodu zdola. U vtch systm je zvykem ob metody
kombinovat, emu se v anglitin k metoda "semi top-down".
     Mylenka je jednoduch. Nejprve udlme hrub nvrh celho
programu. Uvdomme si, kter obraty (obvykle pi komunikaci s
uivatelem nebo s periferiemi) budeme asto pouvat (vstup
etzce, hlen chyb, tisk hlaviky na tiskrnu, atd.) a ty
pak naprogramujeme v dostaten obecnosti jako procedury,
abychom tak zabezpeili stejn een obdobnch situac v celm
systmu. Pot napeme hlavn program (10-20 dek). Rozmyslme
si dobe, co je vstup a co vstup jednotlivch procedur
volanch z hlavnho programu, a pot je zaneme pst opt
metodou semi top-down, piem pi jejich prci se budeme
snait vyut pedem napsanch (a odladnch) procedur.

     Ve popsanmu postupu a zsadm itelnho programovn se
k Strukturovan programovn (v irm smyslu). Dodren
tchto postup je otzka cviku a jist sebekzn.
Strukturovanost programu obvykle svd o vysplosti
programtora. Naute se tmto nebo jinm podobnm zsadm -
usnadnte si prci a uette as!

3.4.2. Zpis podprogram

     Podprogramy jsou v Pure Pascalu verze 5.5 ty typ. Jde o
procedury, funkce, konstruktory a destruktory. Posledn dva
typy se tkaj objektovho programovn a ve verzi 5.0 nejsou
obsaeny. Pro jejich tvorbu plat stejn zsady jako pro tvorbu
procedur. Rozdly oproti procedurm a zpsob jejich pouit
bude popsn v odstavci 6.4. Zde se budeme zabvat pouze
procedurami a funkcemi.

     Podprogram je tedy jist st programu, kterou je mono
zpracovvat vcekrt. Pro svou prci me pouvat sv, tzv.
LOKLN, promnn. Aby bylo mono podprogram vyvolat, m kad
podprogram jmno (identifiktor).
     Kad podprogram mus bt popsn, jedn se o "deklaraci
podprogram". Msto, kde se pechz na zpracovn podprogramu
a kam se po jeho ukonen vpoet vrac, se nazv "voln
podprogramu".
     Pi voln podprogramu je asto poteba pedat podprogramu
njak informace a po jeho ukonen jin zskat. Jde o
pedvn parametr. Tyto parametry mus bt popsny v
deklaraci podprogramu a k se jim "FORMLN". Hodnoty, resp.
promnn, kter se pi voln pedvaj podprogramu, se
nazvaj "SKUTEN" parametry. Formln parametry jsou tedy
jakmisi zstupci skutench parametr v tle podprogramu. Po
pedn parametr jsou provedeny pkazy podprogramu, v nich
jsou za formln parametry "dosazeny" parametry skuten, a po
jejich ukonen se vpoet vrac za msto voln podprogramu.

    Deklarace podprogram

     Nyn popeme syntaxi deklarac podprogram:

<deklarace podprogramu> ::= -<hlavika procedury>    <P. blok>;
                                              -<hlavika funkce>       <P. blok>;
                                              -<hlavika konstruktoru> <P. blok>;
                                              -<hlavika destruktoru>  <P. blok>;

     <hlavika procedury>    ::=
          procedure <id. procedury> <formln parametry> ;

     <hlavika konstruktoru> ::=
          constructor <id. procedury> <formln parametry> ;

     <hlavika destruktoru>  ::=
          destructor <id. procedury> <formln parametry> ;

     <hlavika funkce>             ::=
          function <id. funkce> <formln parametry> : <id. typu> ;

     <P. blok> ::= - <blok>
                           - {dal monosti tla podprogram budou
                     popsny v odstavci 7.7. }
                                                           Ŀ
   <formln parametry> ::=  (  <deklarace parametr>;...  ) 
                                                           

                                Ŀ                       Ŀ
   <deklarace parametr> ::=  var   <id.>,...   :<id.typu> 
                                                       

     Uveden popisy jsou dost sloit, a tak pro nzornost
nkolik pklad:

     procedure ZvetsODve (var i:byte);
          begin i:=i+2 end;

     function X(a,b:byte; var f:file; var Info;
s:string):boolean;
          var i,j:byte;
          begin  ....  end;

     Zde rozeberme pouze hlaviku deklarace podprogramu. 

     Zan klovm slovem, kter uruje, o jak typ podprogramu
jde. Jsou celkem tyi monosti:
-  procedure = Je klasick typ podprogramu. Je voln jako
   pkaz a pi jeho vyvoln se provedou pkazy obsaen v
   jeho tle.
-  function = Je voln jako vraz. Pi jeho vyvoln se
   provedou pkazy obsaen v jeho tle, piem soust tla
   mus bt i vpoet hodnoty, kterou funkce ve vrazu bude
   reprezentovat.
-  constructor = Jde vlastn o proceduru. Me se vyskytovat
   pouze v definici objektu. Pi jeho vyvoln se vedle
   proveden pkaz jeho tla inicializuje dynamick exempl
   pslunho objektu (viz. 6.4.)
-  destructor = Plat o nm tot co o konstruktoru, s tm
   rozdlem, e jde o uvolnn dynamickho exemple
   pslunho objektu.

     Za typem podprogramu nsleduje identifiktor podprogramu,
kter slou pro oznaen podprogramu pi jeho voln.
     U podprogram, kter jsou soust definice objektu, je
identifiktor sloen z jmna objektu a vlastnho identifiktoru
procedury oddlenho tekou, nap.:
          procedure Link.Clear (...);

     Za identifiktorem podprogramu me nsledovat seznam
formlnch parametr. 

     Voln podprogram

     Rozdl mezi funkc a ostatnmi podprogramy je krom toho, e
funkce vrac njakou hodnotu jako vsledek sv prce, pedevm
ve zpsobu voln.
     Procedura je volna jako pkaz, kdeto funkce jako vraz.
Popime syntaxi voln:

     <voln procedury> ::= <id. procedury> <skuten parametry>

     <voln funkce> ::= <id. funkce> <skuten parametry>

piem
                                            Ŀ
   <skuten parametry> ::=  (  <vraz>,... ) 
                                            

     Skutench parametr mus bt vdy tolik, kolik je parametr
formlnch a mus si po ad odpovdat (viz dle). Pi voln
podprogram se skuten parametry vyhodnocuj zprava.
     Poznamenejme, e identifiktor funkce nebo procedury ve
voln funkce nebo procedury me bt i promnn typu funkce
nebo procedura s pslunmi parametry. V tom ppad je
vyvolna procedura, kterou dan promnn reprezentuje. Nebyla-
li tato promnn inicializovna, je vsledek nedefinovn
(prost se sko nkam do pamti...).

     Volnm procedury je popsno i voln konstruktor a
destruktor.

3.4.3. Pedvn parametr

     Parametry podprogramu mohou bt podle zpsobu voln t
typ:
-  Parametry volan hodnotou. Jsou to ty parametry, u jejich
   popisu nen uvedeno klov slovo var a je uveden jejich
   typ.
-  Parametry volan odkazem. Jde o parametry, u jejich popisu
   je uvedeno klov slovo var a je uveden jejich typ.
-  Netypov parametry. Jde o parametry uvozen klovm slovem
   var, u nich nen uveden jejich typ.
Poznamenejme, e zapsn parametru bez klovho slova var a
bez uveden typu nen mon.

     Vimnme si, e typ formlnho parametru mus bt vdy
uveden formou identifiktoru typu. V hlavice podprogramu nen
mon pouvat popis typu.

     Nyn probereme postupn zpsoby prce s jednotlivmi
parametry.

     Parametry volan hodnotou

     Formln parametry volan hodnotou jsou vlastn lokln
promnn pslunho podprogramu. Od promnnch deklarovanch v
rmci bloku podprogramu se li pouze tm, e jsou
inicializovny hodnotou skutenho parametru.
     Skutenm parametrem pi voln hodnotou me bt vraz
kompatibiln vzhledem k piazen s typem formlnho parametru.
V okamiku, kdy m bt pedn parametr volan hodnotou do
podprogramu, je vyhodnocen pslun vraz a hodnota tohoto
vrazu je zkoprovna do formlnho parametru.
     
     Shrme popsan vlastnosti:
-    Skutenm parametrem me bt vraz.
-  Skuten parametr mus bt kompatibiln vzhledem k
   piazen.
-  Hodnota skutenho parametru neme bt zmnna (i kdyby lo
   o promnnou), i kdy se zmn hodnota formlnho parametru.
   Zvyuje se tak bezpenost programu.
-  Voln hodnotou odpovd "vstupnm parametrm".
-  Formln parametry zabraj velikost pamti odpovdajc
   jejich typu. Zaplnn pamti me bt znan.
-  Hodnota skutenho parametru je vdy koprovna do
   formlnho parametru. To me bt dost dlouh.

     S ohledem na kompatibilitu vzhledem k piazen je jasn, e
skutenm parametrem neme bt vraz typu soubor nebo vraz
sloenho typu obsahujc poloku typu soubor. Pro tyto typy je
poteba pout voln odkazem.

     Parametry volan odkazem

     Formln parametry volan odkazem jsou oznaenm skutench
parametr v rmci pslunho podprogramu. Pi bhu podprogramu
je formln a skuten parametr pln ztotonn.
     Skutenm parametrem pi voln odkazem me bt pouze
promnn typu, kter je identick s typem formlnho parametru.
V okamiku, kdy m bt pedn parametr volan odkazem do
podprogramu, je vyhodnocena adresa pslun promnn a tato
adresa je zkoprovna do formlnho parametru. Pi prci s
takovm formlnm parametrem je pomoc adresy manipulovno
pmo s promnnou, kter je skutenm parametrem podprogramu.

     Shrme popsan vlastnosti:
-    Skutenm parametrem me bt pouze promnn.
-  Skuten parametr mus bt identickho typu, jako je typ
   formlnho parametru.
-    Voln odkazem odpovd "vstupn-vstupnmu parametru".
-  Pi voln odkazem me dojt k nezamlen zmn promnn,
   kter je skutenm parametrem.
-  Formln parametr zabr v pamti prostor 4 byt (jeden
   ukazatel). et tak pam.
-  Pi voln odkazem je koprovna pouze adresa, co bv
   rychlej ne koprovn cel promnn.

     Z pravidla o identickch typech skutench a formlnch
parametr existuje jedna vjimka. Jde o ppad, kdy formln
parametr volan odkazem je typu etzec a pepna Var-string
checking je nastaven na Relaxed. Za tchto okolnost me bt
skutenm parametrem promnn typu etzec libovoln dlky. Ale
pozor! Je-li do formlnho parametru piazen kdykoli pi bhu
podprogramu etzec del ne skuten parametr, je pepsna
pam za promnnou, kter je skutenm parametrem, m me
dojt k chyb.

     Netypov parametry

     Netypov parametry jsou vlastn parametry volan odkazem.
Jedin rozdl je ten, e zde nen uveden typ parametru.
Skutenm parametrem me bt promnn libovolnho typu. 
     Pi prci s netypovm formlnm parametrem je vdy poteba
ut mechanismu petypovn (viz 6.3.3) a oznmit tm
pekladai jakho typu formln parametr vlastn je. Netypov
parametry se uvaj pro pedvn parametr promnn dlky
nebo promnnch typ. Podrobn se jejich vyuitm budeme
zabvat v est kapitole.

     Vsledek funkce

     Za ppadnm seznamem parametr nsleduje v hlavice
deklarace funkce identifiktor typu funkce. Tento identifiktor
uruje typ vsledku funkce.

     Typ funkce me bt pouze ordinln typ , reln typ, typ
etzec nebo typ ukazatel (resp. pointer).
     V Pascalu tedy nen mon vytvoit funkci sloenho typu,
typu mnoina, soubor nebo podprogram. Pokud bychom nco
takovho potebovali, musme napsat proceduru s vstupnm
parametrem uvedenho typu (tj. volanm odkazem).

3.4.4. Lokalita identifiktor

     Kad podprogram se skld z hlaviky a bloku. Nyn se
vnujme prvn sti bloku, a to jej deklaraci. Pro deklaran
st podprogram plat v podstat stejn pravidla jako pro
deklarace v hlavnm programu.

     Identifiktory deklarovan v rmci podprogramu (a ji v
deklaraci nebo v hlavice) se nazvaj LOKLN. Identifiktory
deklarovan v hlavnm programu (tzv. GLOBLN) nebo v
podprogramech, do nich je dan podprogram vnoen, se nazvaj
NELOKLN.

     Shrme nkolik pravidel, kter se tkaj deklarac v
podprogramech:
-  Kad pouit nvt v tle podprogramu mus bt
   deklarovno jako lokln v deklaran sti podprogramu.
-  Deklarace formlnch parametr je deklarac promnnch.
   Identifiktory formlnch parametr proto nesm bt znovu
   pouity pi deklaraci dalch loklnch objekt podprogramu.
-  V rmci podprogramu nelze deklarovat typy objekt. Promnnou
   typu objekt ji ano. 
-  Identifiktory deklarovan v rmci podprogramu mohou bt
   stejn jako identifiktory pouit v hlavnm programu, v
   jinch podprogramech nebo v podprogramech, v nich je dan
   podprogram deklarovn (tzv. "VNOEN" podprogram). 
-  V podprogramech, kter jsou soust objektu, je implicitn
   deklarovna promnn Self. Je typu ukazatel na objekt a
   odkazuje na prv zpracovvan objekt (viz 6.4).

     Jak jsme ji uvedli, nkter lokln a nelokln
identifiktory mohou bt stejn (akoli mohou oznaovat pln
nco jinho). V tomto ppad hovome o ZAKRYT neloklnho
identifiktoru identifiktorem loklnm.
     V tle podprogramu lze pouvat (kme, e jsou DOSTUPN)
vechny lokln identifiktory a vechny nezakryt nelokln
identifiktory. Zakryt nelokln identifiktory a
identifiktory deklarovan v ostatnch podprogramech jsou
nepstupn.

     Tato pravidla demonstrujme na pklad:

          program Lokalita;
          type a = set of char;
          var i,j,k : byte;
         {$F+}
          procedure P1 (i:shortint; var x:byte);
             {$F-}
               var a,b,c : char; { i,x se zde ji nesm vyskytnout }
               begin
                    { Typ "a" spolu s promnnou "i" jsou nepstupn. }
                    ... { Pstupn j,k, i,x, a,b,c. }
               end;
          function F (i:byte) : byte;
               var h : file;
                     aa: a;
                     p : procedure (i:shortint; var x:byte);
               procedure P2;
                    var b : string;
                    begin b:='Cislo: ';
                              if @p=@p1 then writeln( b,p(13,i+j+k),aa,h);
                              ... { Ostatn promnn jsou nepstupn }
                    end;
               begin     p:=p1;
                         p2;
                         aa:=['1','2'];
               end;
          begin { Zde jsou pstupn pouze i,j,k; typ a; podpro 
gramy P1 a F. }     
                    ...
          end.

3.4.5. Tlo podprogramu

     Kad podprogram mus mt v rmci svho bloku i pkazovou
st, tzv. TLO podprogramu.
     Tlo podprogramu mus bt vdy uzaveno v begin - end
zvorkch, i kdyby lo o jedin pkaz.

     Tlo funkce mus obsahovat definici vsledku. Vsledek se
definuje pomoc piazovacho pkazu. Na lev stan tohoto
pkazu se uvd identifiktor funkce bez parametr a na prav
vsledn vraz. Toto piazen me bt provedeno i vcekrt.
Nen-li provedeno ani jednou, dostvme se do stejnch problm
jako v ppad neinicializovan promnn. Chyba se nehls a
vsledek je nedefinovn.
          Pklad:  function F(x:byte):byte;
                              begin write(x); F:=x end;

     Tlo podprogram v objektech je implicitn uzaveno do
pkazu "with Self do". Tm je zajitno, e vechny poloky
objektu, k nmu podprogram pslu, jsou v objektu lokln
(viz 6.4).

     V tle podprogramu lze pout proceduru:

Ŀ
    procedure Exit;                                         


Tato procedura ukon zpracovn prv provdnho podprogramu.
Vpoet dle pokrauje za volnm tohoto podprogramu.

3.4.6. Rekurze

     Pm rekurze

     Jak ji vme, lze v tle podprogramu pout vechny
nezakryt nelokln identifiktory. Takovm identifiktorem je
i jmno vlastnho podprogramu. Toto jmno neme bt zakryto
jinm identifiktorem, nebo je, stejn jako u jmna programu,
soust deklarace podprogramu. 
     Z uvedenho plyne, e je mon v tle podprogramu opakovan
vyvolat tent podprogram. Takovmu cyklickmu voln
podprogram se k REKURZIVN voln.

     V odstavci 3.4.4. jsme diskutovali tzv. "STATICK VNOEN
PODPROGRAM". Jeden podprogram je staticky vnoen v druh, je-
li v jeho deklaran sti zapsn jako lokln podprogram. Z
tto definice potom plyne pstupnost identifiktor.
     Podprogram je "DYNAMICKY VNOEN" do druhho, je-li voln v
jeho tle. Nedochz-li k rekurzi, jsou dynamicky vnoen
podprogramy vdy vnoeny i staticky nebo jsou zapsny v
deklaran sti jednoho bloku, piem dynamicky vnoen
podprogram mus bt deklarovn a za podprogramem volajcm.

     Pi rekurzivnm voln vznik problm s pstupnost k datm
pedchozch voln tho podprogramu (Hovome o DYNAMICKM
PRGMPLI PODPROGRAMU). een je jednoduch. Rekurzivn voln
podprogramu zakrv data pedchozch dynamickch exempl
tho podprogramu. Pi nvratu v rmci rekurzivnch voln jsou
ovem opt pstupn.
                                                     
     Pklad:                                        Ŀ
          program Rekurze;                           REKURZE 
          var n:byte; c:char;                        n = 3   
          procedure Radek( i:byte; var c:char);      c = '*' ˻
               var j:shortint;                       <hlavn>
               begin                                 ٺ
                    if i>1 then Radek(i-1,c);   {~1 }         
               for j:=1 to n-i do write(' ');        Ŀ
                    for j:=-i to i do write(c);      RADEK   
                    writeln;                         i = 3   
                    if i>1 then Radek(i-1,c);   {~2 }c = ...ؼ
               end;                                  j = ?    
          begin                                      <voln z 
               n:=3;                                 REKURZE> 
               c:='*';                                
               Radek(n,c);                                     
          end.                                       Ŀ 
                                                     RADEK    
     Vsledkem bude tento vpis:                     i = 2    
               ***                                   c = ...ͼ
            *****                                    j = 2     
               ***                                   <voln z  
           *******                                   RADEK~1>  
               ***                                     
        *****                                                   
               ***                                   Ŀ  
                                                     RADEK     
     Na prav stran je zobrazen stav dynamickch    i = 1     
exempl procedur pi vpisu tet dky, v         c = ...ͼ
okamiku, kdy se vypisuje prostedn hvzdika.      j = 0    
V kadm dynamickm exempli je vdy uvedeno        <voln z 
jeho jmno, stav promnnch a msto voln.          RADEK~2> 
Dvojit ra vyznauje odkaz promnn c na jej       
exempl v hlavnm programu (je volna odkazem).

     Ken rekurze

     V nkterch vjimench ppadech vznik poteba, aby se dva
nebo vce podprogram volalo navzjem. Toto, s ohledem na
pravidlo, e kad pouit identifiktor mus bt nejprve
deklarovn, nen mon. Aby to mon bylo, je poteba
podprogram, kter bude v rmci ken rekurze voln, pedbn
deklarovat.

     Pedbn deklarace se provd takto:
-  Ped deklaraci podprogramu, z nho je rekurzivn podprogram
   voln, je poteba zapsat deklaraci podprogramu volanho,
   avak namsto bnho tla podprogramu se uvd direktiva
   forward. Peklada je tak zpraven o existenci tohoto
   podprogramu a je jej mon volat z jinch podprogram,
   akoli jet nebyl pln deklarovn.
-  Vlastn deklarace pedbn deklarovanho podprogramu ji
   vypad zcela normln, s tm rozdlem, e se v n neuvd
   seznam formlnch parametr procedury.

     Poznamenejme, e v unitch u podprogram deklarovanch v
sti interface direktivu forward nelze pout, nebo vechny
tyto podprogramy jsou chpny jako "forward" automaticky (viz
6.5.).

     Pklad:
          program KenRekurze;
          procedure A (i:byte; j:real);
               forward;
          procedure B (x:real);
          var  ...
          begin     ...
                    A(12,x);
                    ...
          end;
          procedure A;  { Parametry se vynechvaj }
          var  ...
          begin     ...
                    B(j);
                    ...
          end;
          begin ... B(12.9E-5); ... end.

     Otzky a cvien

 1. Jak vypad vraz typu mnoina?
 2. Jak znte binrn opertory a jak maj priority?
 3. Kdy me dojt k chyb 201 Range Check Error?.
 4. Jak me promnn zskat hodnotu?
 5. Jak typy jsou identick?
 6. Uvete pklady, kdy je typ A kompatibiln vzhledem k      
    piazen s typem B, ale opan to neplat. Jak to m   
      dsledky pro piazovac pkaz.
 7. Ve kterch ppadech me bt stednk "navc" a kdy nesm 
      bt za pkazem uveden?
 8. Popite rozdly mezi WHILE a REPEAT cyklem.
 9. Jak plat omezen pro dc promnnou cyklu?
10. Ve kterch ppadech je vhodn pout pkaz GOTO?
11. Kter z tchto zpis je lep a pro?
               x.a:=1;              with x do
               x.b:=2;                       begin a:=1; b:=2 end;
12. Popite Vae zsady pro psan "itelnch program".
13. Jak se li procedury a funkce?
14. Jak znte zpsoby pedvn parametr podprogramm a v em
    se li?
15. Napite a odlate program pro vpoet faktorilu s pouitm
    rekurzivnho voln funkce.

4. INTEGROVAN SYSTM

     Tato kapitola je vnovna prci v integrovanm systmu Pure
Pascalu.

     Integrovan systm Pure Pascalu (IS) je interaktivn
programov systm, pod kterm lze vytvet, editovat,
pekldat, sestavovat, spoutt a ladit turbopascalsk
programy. Integrovan systm obsahuje
     -obrazovkov textov editor,
     -kompiltor Pure Pascalu,
     -linker turbopascalskch program,
     -debugger pro turbopascalsk programy,
     -prostedky, kter podporuj spoutn turbopascalskch
      program z IS, pouvn parametr a pepna IS a 
      spoluprci s operanm systmem.

     Editor je program, kter umouje vytvet a opravovat
(editovat) textov soubory. 
     Kompiltor neboli peklada je program uren pro peklad
uritho zpisu (nejastji programu) z jednoho jazyka do
druhho. Kompiltor IS pekld programy a unity z jazyka Pure
Pascal do strojovho kdu procesoru 8086. Zpisu programu nebo
unity v jazyce Pure Pascal budeme kat zdrojov kd programu
resp. unity.
     Linker neboli sestavovac program sestavuje peloen
programy a unity do vslednho kdu. Linker IS pipoj k
peloenmu kdu programu i unity kdy knihovnch podprogram
(tj. kdy podprogram uvanch unit) a kdy externch procedur
a funkc (object modul).
     Debugger neboli ladc program je prostedek pro ladn
uivatelskch program. Debugger usnaduje hledn a
odstraovn bhovch a logickch chyb v programu. Debugger IS
provd vpoet programu po stech, kter uruje uivatel. Po
proveden kad sti debugger vpoet programu zastav a
umon prohldnout si hodnoty promnnch a posloupnost procedur
a funkc, jejich voln vedlo k danmu mstu v programu,
zmnit hodnoty promnnch, vyhodnocovat rzn vrazy, ukonit
vpoet programu nebo v provdn programu pokraovat. 

     Integrovan systm komunikuje s uivatelem prostednictvm
soustavy menu. Volbou poloek jednotlivch menu lze vyvolat
pkazy integrovanho systmu, kter v souhrnu umouj toto:
     -vyvoln editoru, kompiltoru, linkeru a debuggeru,
     -sputn peloenho a sestavenho programu vetn
      pedn parametr tomuto programu,
     -nastaven parametr a pepna IS,
     -uloen nastavench parametr a pepna do
      konfiguranho souboru,
     -zaveden konfiguranho souboru, tj. nastaven parametr
      a pepna IS na hodnoty uloen v tomto konfiguranm
      souboru,
     -pstup k souborm uloenm v adresch na disku a
      vytven novch soubor,
     -peruen nebo ukonen prce v IS.

     Struktura soustavy menu IS je uvedena na obrzcch na
nsledujcch strnkch.
ͻ
 File   Edit   Run   Compile   Options   Debug   Break/watch 
ͼ
                       Ŀ
                Ŀ                         
Ŀ                                    
 Load      F3         Ŀ    
 Pick  Alt-F3          Run           Ctrl-F9     
 New                   Program reset Ctrl-F2     
 Save      F2          Go to cursor       F4     
 Write to              Trace into         F7     
 Directory             Step over          F8     
 Change dir            User screen    Alt-F5     
 OS shell                 
 Quit   Alt-X                                      
                                     
                                                     
                          Ŀ
                           Compile  Alt-F9                 
                           Make         F9                 
                           Build                           
                           Destination      Memory         
                           Find error                      
                           Primary file:                   
                          Get info                        
                         
                         
                         
  Information ͻ
                                                         
  Current directory : C:\                                
  Current file      : C:\NONAME.PAS                      
  File size         : 0 (Max: 64613)                     
  EMeSs usage         : 0K                                 
                                                         
  Lines compiled: 0                                      
                                                         
  Code is not available.                                 
  Program exit code                                      
                                                         
  Code size                     0 bytes                  
  Data size                     0 bytes                  
  Stack size                16384 bytes                  
  Minimum heap size             0 bytes                  
  Maximum heap size        655360 bytes                  
                                                         
  Available memory: 187K                                 
                      Press any key                      
ͼ



       Struktura soustavy menu integrovanho systmu
            (pokraovn na dal strnce)

ͻ
 File   Edit   Run   Compile   Options   Debug   Break/watch 
ͼ
                                      
                                        
   Ŀ         Ŀ
 Ĵ Compiler                   Add watch          Ctrl-F7 
   Linker      Ŀ        Delete watch               
   Environment    Ŀ     Edit watch                 
Ĵ Directories              Remove all watches         
  Parameters              Ĵ
  Save options             Toggle breakpoint  Ctrl-F8 
  Retrieve options         Clear all breakpoints      
         View next breakpoint       
                            
  Ŀ Ŀ
  Map file              Evaluate      Ctrl-F4        
  Link buffer  Memory   Call stack    Ctrl-F3        
 ٳ  Find procedure               
  Ŀ            Integrated debugging   On    
 Ĵ Off                  Standalone debugging   Off   
    Segments             Display swapping        Ŀ
    Publics              Refresh display               
    Detailed             
                                    Ŀ 
     Ŀ                    Smart  
     Config auto save  On                      Always 
      Edit auto save    On                      None   
      Backup files      On                     
      Tab size          8         Ŀ
      Zoom windows      On         25 line display    
      Screen size     Ĵ 43/50 line display 
           
Ŀ        
 Range checking       On                
 Stack checking       On                
 I/O checking         On                
 Force far calls      Off               
 Overlays allowed     On                
 Align data           Byte              
 Var-string checking  Strict     Ŀ
 Boolean evaluation   Complexe    Stack size      16384  
 Numeric processing   Software    Low heap  limit 0      
 Emulation            On          High heap limit 655360 
 Debug information    On         
 Local symbols        On            
 Conditional defines                
 Memory sizes       
     
    Ŀ
Ĵ Pure     directory:  C:\TPAS                        
      PRG & TPU directory:  C:\TPAS\ADR                    
      Include directories:  C:\TPAS\ADR                    
      Unit    directories:  C:\TPAS\UNITS;C:\TPAS\ADR      
      Object  directories:                                 
      Pick file name:       C:\TPAS\PURE.PCK              
      Current pick file:    TPAS\PURE.PCK                 
     


Hlavn menu

     Hlavn menu IS je zobrazeno v prvnm dku obrazovky IS a m
sedm poloek:

Ŀ
 File   Edit   Run   Compile   Options   Debug   Break/watch 


File
     Po vbru tto poloky se zobraz menu "File", kter
obsahuje pkazy pro zaveden souboru do editoru, uloen
editovanho souboru na disk, vytvoen novho souboru, zmnu
aktulnho adrese, zobrazen obsahu libovolnho adrese,
peruen a ukonen prce v IS. Pkazy menu "File" jsou
popsny v odstavci 4.2.

Edit
     Vbrem poloky Edit vyvolme editor IS. Prci s editorem je
vnovn odstavec 4.1.

Run
     Po vbru tto poloky hlavnho menu se zobraz menu "Run",
kter obsahuje pkazy pro sputn programu, trasovn a
krokovn programu a zobrazen vstupu programu. Pkazy menu
"Run" jsou popsny v odstavcch 4.4, 4.5.2 a 4.5.3.

Compile
     Vybereme-li z hlavnho menu poloku "Compile", zobraz se
menu "Compile", jeho pkazy umouj proveden pekladu, 
sestaven program, vyhledn bhovch chyb a vyvoln
systmovch informac. Pkazy menu "Compile" jsou popsny v
odstavci 4.4.2.

Options
     Po vbru tto poloky se zobraz menu "Options", kter
obsahuje pkazy pro nastaven parametr a pepna editoru,
pekladae, sestavovacho programu a ostatnch parametr IS.
Jednotliv parametry a pepnae jsou popsny v odstavcch
4.1.5, 4.3, 4.4.1 a 4.6.

Debug
     Po vbru poloky Debug se zobraz menu "Debug", jeho
pkazy umouj sledovat a modifikovat hodnoty promnnch,
vyhodnocovat vrazy, sledovat stav zsobnku voln
podprogram, rychle vyhledvat  ve zdrojovm souboru deklarace
procedur a funkc, zapnat a vypnat debugger a dit stdn
uivatelsk obrazovky a obrazovky IS bhem ladn programu.
Pkazy menu "Debug" jsou popsny v odstavcch 4.5.2, 4.5.5,
4.5.6 a 4.5.7.

Break/Watch
     Po vbru tto poloky hlavnho menu se zobraz menu
"Break/Watch", kter obsahuje pkazy pro nastaven, ruen a
nalezen breakpoint a pkazy pro zadvn promnnch a vraz
do okna "Watch", pro editaci a ruen promnnch a vraz
umstnch v okn "Watch". Pkazy tohoto menu jsou popsny v
odstavcch  4.5.2. a 4.5.4.

     Z nabdek jednotlivch menu integrovanho systmu vybrme
poloky bu "pirozenm" zpsobem - pomoc klves se ipkami a
klvesy Enter nebo stisknutm klvesy odpovdajc prvnmu
psmenu vybran poloky.

     Kad z menu "File", "Run", "Compile", "Options", "Debug" a
"Break/Watch" lze odkudkoliv z IS vyvolat souasnm stisknutm
klvesy Alt a klvesy odpovdajc prvnmu psmenu nzvu tohoto
menu. Podobn lze odkudkoliv z IS vyvolat editor - souasnm
stisknutm klves Alt a E.

     Z vyvolanho menu se do pedchozho menu navrtme
stisknutm klvesy Esc. Z editoru se do hlavnho menu dostaneme
stisknutm klvesy F10.


Zaveme nsledujc znaen:

     Zpis tvaru 

          <poloka menu>        resp.
      <poloka menu>/...

oznauje pkaz IS resp. pepna IS resp. parametr IS uren
postupnm vbrem uvedench poloek menu IS, nap.

Edit
   ... pkaz, kter vyvol editor,
File/Change dir
   ... pkaz pro zmnu aktulnho adrese,
Compile/Compile
   ... pkaz, kter vyvol peklad souboru zavedenho do
   editoru,
Options/Compile
   ... pkaz pro nastaven pepna kompiltoru,
Options/Compile/Stack checking
   ... pepna kompiltoru, kter zapn resp. vypn kontrolu 
   peteen zsobnku,
Options/Compile/Pure directory
   ... parametr IS, kter uruje nzev adrese, v nm IS
   hled soubory PURE.TP (implicitn konfiguran soubor IS) a
   PURE.HLP (soubor obsahujc help Pure Pascalu), pokud
   nejsou uloeny ve stejnm adresi jako soubor PURE.PRG.


    Zpis tvaru 

          <klvesa>

oznauje pkaz IS nebo pkaz editoru, kter lze vyvolat
stisknutm klvesy <klvesa>, nap.

F2   ... pkaz IS pro uloen souboru zavedenho v editoru 
         na disk,
Home ... pkaz editoru pro posun kurzoru na zatek dky.


     Zpis tvaru

          <klvesa_1>-<klvesa_2>

oznauje pkaz IS nebo pkaz editoru, kter lze vyvolat
souasnm stisknutm klves <klvesa_1> a <klvesa_2>, nap.

Alt-F9    ... pkaz IS, kter vyvol peklad souboru 
              zavedenho v editoru,
Ctrl-PgDn ... pkaz editoru pro posun kurzoru na konec 
              souboru.


     Zpis tvaru 

          <klvesa_1>-<klvesa_2><klvesa_3>

oznauje pkaz editoru, kter lze vyvolat postupnm souasnm
stisknutm klves <klvesa_1>, <klvesa_2>  a  klves
<klvesa_1>, <klvesa_3>  nebo  souasnm stisknutm klves
<klvesa_1>, <klvesa_2> nsledovanm stisknutm klvesy
<klvesa_3>, nap.:

Ctrl-KY ... pkaz editoru pro smazn oznaenho bloku.


A jet zavedeme pojem  oznaen skupiny soubor:

     Oznaenm skupiny soubor budeme rozumt zpis tvaru

          [<disk>:] [\<adres>\...] <skupina soubor>  ,

kde <skupina soubor> je zpis specifikujc jeden nebo vce
soubor tak, jak jsme zvykl z MeSs DOSu, nap.

               *.*  
               *.PAS
           PROG?.*  
           TEXT*.TXT
          SOUBOR.DB?


Spodn informan dek

     Spodn informan dek obsahuje informace o
nejdleitjch funknch klvesch, je jsou v danm okamiku
dostupn. Pouit tchto funknch klves je ekvivalentn
pkazm IS a bude postupn vysvtleno.

     Speciln postaven mezi funknmi klvesami m klvesa Esc,
kter se pouv pi vskoku z vyvolanho menu, pi vskoku z
vyvolanho vstupnho pole, pi ruen pole s chybovou hlkou
apod.

     Pro ilustraci si uveme, jak vypad spodn informan dek
v nkterch situacch:

- je-li aktivn hlavn menu nebo okno "Edit", obsahuje spodn
informan dek tyto daje:

F1-Help F5-Zoom F6-Switch F7-Trace F8-Step F9-Make F10-Menu

- je-li aktivn okno "Watch", vypad spodn informan dek
takto:

F1-Help F5-Zoom F6-Switch F10-Menu Ins-Add Del-Delete Edit 

- po vyvoln pkazu File/Load takto:

F1-Help  Esc-Abort 

     Stiskneme-li klvesu Alt a podrme-li ji nkolik sekund, je
ve spodnm informanm dku zobrazen vznam nkterch
funknch klves, pouijeme-li je souasn s klvesou Alt.

Alt: F1-Last help  F3-Pick  F5-Saved screen  F9-Compile  X-Exit


Vstupn pole

     Po vbru nkterch poloek menu IS se objev vstupn pole.
Vstupn pole jsou urena pro zadvn jmen soubor, s nimi
chceme pracovat, pro specifikaci parametr IS apod. Napklad
po vyvoln pkazu File/Load je zobrazeno vstupn pole, do
nho lze zadat jmno souboru, kter chceme zavst do editoru:

        Load File Name Ŀ
        *.PAS                                    
       

     Po vyvoln vstupnho pole je v poli zobrazen etzec znak,
kter byl do pole zadn pi jeho pedchozm vyvoln (pi
prvnm vyvoln obsahuje vstupn pole implicitn etzec).
Pokud nestiskneme nkterou z klves
     -    prav resp. lev ipka,
     -End, Home,
     -    Backspace, Del,
     -    PgDn, PgUp, Ins,
lze tento etzec pout pi zadvn vlastnho vstupu, jinak
etzec zmiz a do pole lze zapsat etzec nov. Pvodn
etzec je mon kdykoliv obnovit stisknutm Ctrl-R.
     Zadvn etzce do vstupnho pole ukonme stisknutm
klvesy Enter. Nechceme-li do zadat dn etzec, lze z pole
vyskoit stisknutm klvesy Esc.


Okna

     Pi prci v IS mohou bt na displeji monitoru stdav
zobrazovny dv rzn obrazovky: obrazovka IS a uivatelsk
obrazovka.

     Uivatelsk obrazovka je obrazovka, na kterou je pi prci v
IS generovn vstup uivatelskch program. Po zaveden IS do
pamti je obsah uivatelsk obrazovky shodn s obsahem posledn
obrazovky DOSu, pi vskoku z IS je pak na obrazovce DOSu
zobrazena posledn uivatelsk obrazovka. Zobrazen uivatelsk
obrazovky lze vyvolat pkazem  Run/User screen  resp. Alt-F5 a
stisknutm libovoln klvesy pak znovu vrtit na displej
obrazovku IS.

     Obrazovka IS obsahuje neustle hlavn menu, spodn
informan dek a (podle nastaven pepnae
Options/Environment/Zoom windows) jedno nebo dv okna. Pi
implicitnm nastaven pepnae Options/Environment/Zoom
windows (Off) jsou na obrazovce IS dv okna: horn st
obrazovky IS pod dkem s hlavnm menu je vyhrazena oknu
"Edit", ve spodn sti je zobrazeno bu okno "Watch" nebo okno
"Output".

     Okno "Edit" slou ke tem elm:
-  pro vytven a editaci textovch soubor (program, unit,
   datovch soubor atd.),
-  pro zobrazen zdrojovho kdu t sti programu, v n byla
   nalezena pekladov i bhov chyba, a zobrazen pslun
   chybov hlky s monost tuto chybu opravit,
-  pro zobrazen zdrojovho kdu t sti programu, kter je
   prv ladna (tj. sti zdrojovho kdu programu, s n
   pracuje debugger) s monost bhem ladn programu zdrojov
   kd editovat, nastavovat breakpointy v rznch stech kdu
   a zavdt do editoru jin soubory.

     Okno "Watch" se pouv pi ladn program ke sledovn
hodnot promnnch a vraz, je lze do okna zadat pomoc
pkazu Break/Watch/Add watch.

     Okno "Output" zobrazuje vstup programu, tj. obsah
uivatelsk obrazovky, kter lze pi prci v IS vyvolat tak
pomoc pkazu Run/User screen (Alt-F5). Okno "Output" pracuje
pouze v textovm mdu; je-li obrazovka vygenerovan programem
grafick, lze pro jej zobrazen pout pouze pkazu Run/User
screen.

     Pi prci v IS je v kadm okamiku aktivn nejv jedno
okno. Horn st rmeku aktivnho okna je dvojit a obsah okna
lze prohlet. Po vyvoln editoru se stane aktivnm okno
"Edit". Stiskneme-li v okamiku, kdy je okno "Edit" aktivn,
klvesu F6, stane se aktivnm jedno z oken "Watch" nebo
"Output". Mezi tmito dvma okny lze pepnat pomoc pkazu
Alt-F6. Po dalm stisknut klvesy F6 se stane aktivnm opt
okno "Edit". (Viz nsledujc obrzek.)


Pkazy a pepnae IS pro prci s okny:

Options/Environment/Zoom windows (F5)

     Tento pepna uruje poet oken zobrazench na obrazovce
IS. Je-li nastaven na Off, jsou na obrazovce IS zobrazena dv
okna, piem horn okno je vdy okno "Edit". Je-li pepna
nastaven na On, je cel obrazovka (krom prvn a posledn
dky) vyhrazena aktivnmu oknu.


Run/User screen (Alt-F5) 

     Pkaz zobraz uivatelskou obrazovku. Obrazovka IS se znovu 
objev po stisknut libovoln klvesy.


F6
     Pkaz F6 slou pro nastaven aktivnho okna. Je-li aktivn
okno "Edit", stane se po vyvoln tohoto pkazu aktivn okno
"Watch" nebo "Output"; je-li aktivn okno "Watch" nebo
"Output", stane se aktivnm okno "Edit".


Alt-F6
     Je-li aktivn okno "Edit", zavede tento pkaz do editoru
soubor, kter v nm byl bezprostedn ped prv editovanm
souborem. Je-li aktivn okno "Watch" nebo "Output", pepn
pkaz mezi tmito okny.


F10
     Pkaz pepn mezi aktivnm oknem a hlavnm menu.

Schma pepnn mezi obrazovkami a okny pi prci v IS
                     ͻ
                                 
                                 
                                 
                                 
                                 
                     ͼ
   uivatelsk           *      libovoln 
    obrazovka                   klvesa 
 ............................. ..........................
    obrazovka     Alt-F5        
       IS                     *  
                      Edit ͻ                         
                                  
                                       
   Ķ            Ŀ
        F6                                  F6    
              Ķ            Ŀ           
                   ͼ                 
               F5                   F5            
                                                  
        Edit ͻ              Edit ͻ    
                   Ŀ         Ķ                
                                              
                    F6       F6                 
        Watch Ķ            Output Ķ    
                            Ķ                
       Ѽ             ͼ    
                   Alt-F6                
               F5                   F5            
                                                  
        Watch ͻ              Output ͻ    
                                                
   Ķ                                     
                                              
                    Ķ             
                       Alt-F6                 
        ͼ             ͼ 

Help

     Pi prci v IS lze kdykoliv vyvolat help, kter obsahuje
informace o IS a popis jazyka Pure Pascal (vetn popisu
standardnch unit, procedur a funkc) doplnn o demonstran
pklady.

     Help vyvolme stisknutm klvesy F1. Uprosted obrazovky se
oteve okno, v nm jsou uvedeny informace o t sti IS, z n
byl help vyvoln. Stiskneme-li znovu klvesu F1, objev se
obsah helpu, tzv. help index:

     Help Ŀ
                                                    
                          Index                     
                                                    
      Help on Help           Hot keys               
      Editor                 Error messages         
       block commands        Installation (TINST)   
       cursor movement       Library functions      
       insert & delete       Library procedures     
       miscellaneous         Menu commands          
      Command-line options   Reserved words         
      Compiler directives    Units                  
      Debugging              Windows                
                                                    
    

Pomoc klves se ipkami a klves Home a End lze oznait
libovolnou poloku help indexu (oznaen poloka je barevn
zvraznna). Po stisknut klvesy Enter je pak v okn zobrazena
prvn strnka pslun sti helpu.

     Strnkami helpu lze listovat pomoc klves PgDn, PgUp. Dle
je mon pi prohlen helpu pout klovch slov. Klov
slova jsou na strnkch helpu zobrazena jinou barvou ne
ostatn text a lze z nich vybrat stejn jako z poloek help
indexu. Po vbru klovho slova se v okn helpu objev
strnka s informacemi vztahujcmi se k danmu klovmu slovu.


     Zpt do IS se z helpu navrtme stisknutm klvesy Esc.
Pomoc pkazu Alt-F1 je mon odkudkoliv z IS postupn vyvolat
20 naposledy zobrazench strnek helpu.

     Pi prci v editoru lze pomoc pkazu Ctrl-F1 pmo vyvolat
strnku helpu s informacemi o vyhrazenm slov nebo
peddefinovanm identifiktoru, na nm (nebo tsn za nm) je
umstn kurzor.

     IS verze 5.5 Pure Pascalu umouje penst text z libovoln
strnky helpu do souboru zavedenho v editoru. Penesen text
je do editovanho souboru vloen na pozici kurzoru. Pi
penen textu z helpu postupujeme nsledovn:
     Umstme kurzor v editovanm souboru na msto, na kter
chceme vloit text z helpu. Vyvolme help a najdeme strnku, ze
kter chceme text penst. Po stisknut klvesy C se objev v
hornm levm rohu strnky kurzor. Pomoc ipek umstme kurzor
na prvn znak penen sti textu a stiskneme klvesu B. Pak
posuneme kurzor na konec penenho textu (st textu, kter
bude penesena, je zvraznna) a stiskneme Enter.

Poznmka: Help Pure Pascalu je uloen v souboru PURE.HLP.
Chceme-li help pouvat, je teba, aby byl soubor PURE.HLP
umstn na disku ve stejnm adresi jako soubor PURE.PRG nebo
v adresi urenm parametrem Options/Directories/Pure
directory.


Rozen soubor

     Pi prci v IS maj nkter rozen soubor urit vznam:

.PRG  oznauje "executable file", tj. peloen a sestaven
      program, kter je spustiteln pmo z DOSu,
.PAS  je rozen pro soubor obsahujc turbopascalsk
      zdrojov kd (lze pout i jakkoliv jin rozen),
.PPU  oznauje "Pure Pascal unit file", tj. soubor obsahujc
      pedkompilovanou unitu (po pekladu unity vygeneruje
      kompiltor .TPU soubor, jeho jmno je a na rozen
      shodn se jmnem souboru, kter obsahuje zdrojov kd
      tto unity),
.PPL  oznauje  "Pure Pascal library  file",  tj. knihovnu
      .TPU soubor  (v kadm okamiku lze pracovat jen s
      jednou knihovnou; standardn knihovna Pure Pascalu je   
      PURE.TPL),
.PP   oznauje konfiguran soubor IS, tj. soubor, v nm je
      uloeno urit nastaven parametr a pepna IS (IS
      me mt vce konfiguranch soubor; tyto soubory
      umouj potlait implicitn nastaven parametr a
      pepna IS),
.PCK  oznauje "Pick file", tj. soubor, kter se pouv pro
      uloen nkterch informac tkajcch se prce s
      editorem IS (obsahuje nap. seznam osmi naposledy
      editovanch soubor; PICK soubor me bt soust
      konfiguranch soubor)
.BAK  oznauje "Backup file", tj. zlon kopii souboru, kter
      byl po zaveden do editoru modifikovn (vytven
      zlonch kopi lze potlait vypnutm pepnae
      Options/Environment/Backup files),
.MAP  oznauje "Map file", tj. textov soubor obsahujc
      informace o programu, kter lze vyut pi ladn
      programu (generovn tohoto souboru lze zapnout i
      potlait pomoc pepnae Options/Linker/Map file). 


4.1. Prce s editorem

     Editor integrovanho systmu je obrazovkov editor, kter m
piblin 50 pkaz umoujcch ovldn pohybu kurzoru,
psan, prohlen a opravu textu, vyhledvn a pepisovn
etzc v textu, uloen celho textu nebo jeho st do
soubor na disk atd. Prce s editorem integrovanho systmu je
podobn prci s editory WordStar nebo SideKick.

     Obsah editovanho souboru je zobrazen na velk sti
obrazovky IS. Aktuln pozice v souboru (tj. msto, na kter je
umstn znak zadan z klvesnice), je oznaena kurzorem
(blikajc podtrhovtko). Kurzor lze v souboru pemstit na
libovoln dek a do libovolnho sloupce pomoc klves pro
pohyb kurzoru (klvesy se ipkami, PgUp, PgDn, Home, End).
Obsah souboru lze prohlet dvma zkladnmi zpsoby:
-  po dkch - pomoc klves ipka nahoru, ipka dol - tzv.
   rolovn,
-  po strnkch - pomoc klves PgUp, PgDn - tzv. listovn.

     Editor IS je vyvoln v tchto ppadech:
-  po vbru poloky "Edit" hlavnho menu,
-  po stisknut klves Alt-E kdekoli v integrovanm systmu,
-  po stisknut libovoln klvesy pot, co se objev hlka o
   pekladov i bhov chyb.

     Po vyvoln editoru se stane aktivnm okno "Edit" (v okn se
objev kurzor, jsou v nm zobrazovny znaky zadvan z
klvesnice, lze vyvolat pkazy editoru a nastavovat jeho
pepnae). 
     Peshneme-li pi zadvn textov dky ku okna "Edit",
roluje se obsah okna doleva. Dlka kad dky vak me bt
maximln 248 znak. Po pekroen tto dlky se ozve zvukov
signl a dal znaky nelze na dku zapisovat.


Definice slova

     Slovo je definovno jako posloupnost znak ohranien nkte- 
ktermi z nsledujcch oddlova:

     mezera  <  >  ,  ;  .  (  )  [  ]  ^  '  *  +  -  /  $


Reimy prce editoru

     Zpsob prce editoru zvis na nastaven md a pepna
editoru (viz 4.1.3).

     Zkladnmi mdy editoru jsou md "Insert" a md "Overwrite".
     Implicitnm mdem je md "Insert", v nm lze vkldat do
textu nov znaky. Pi vloen kadho novho znaku se text,
kter zan na pozici kurzoru, posune dl doprava.
     Md "Overwrite se pouv pi pepisovn starho textu
textem novm. V tomto mdu znaky zadvan z klvesnice
pepisuj v editovanm textu znaky, kter jsou na pozici
kurzoru.

     Dalm mdem editoru je md "Tab", kter umouje pouvat
pevn nastaven tabultor. Tabultor v textu nahrazuje nkolik
po sob nsledujcch mezer, pitom se chov jako jeden znak.
     Pracuje-li editor v mdu "Tab", je po kadm stisknut
klvesy  Tab  resp. Ctrl-I 
- v mdu "Insert" vloen do textu na pozici kurzoru tabultor,
- v mdu "Overwrite" nahrazen znak na pozici kurzoru
tabultorem. Implicitn dlka tabultoru je 8 znak. Velikost
tabultoru lze mnit pomoc pkazu Options/Environment/Tab
size (viz 4.5.1).
     Je-li md "Tab" vypnut, posouv se kurzor po stisknut
klvesy Tab resp. Ctrl-I do nejbliho sloupce, v nm na
pedchozm dku zan dal slovo. 
     Implicitn nen md "Tab" nastaven.

     Pepnae editoru uruj zpsob indentace (odsazovn) dek
psanho textu (viz 4.1.3).


Stavov dek okna "Edit"

     Okno "Edit" m dva informan dky: spodn dek, v nm
jsou zobrazeny nkter aktivn funkn klvesy, a stavov dek
(prvn dek okna).

     Stavov dek poskytuje informace o editovanm souboru, o
pozici kurzoru a o nastaven md a pepna editoru:


Line n  Col n  Insert Indent Tab Fill Unindent  * C:NAME.EXT

Line n     .. kurzor je na n-t dce editovanho souboru,
Col n      .. kurzor je v n-tm sloupci editovanho souboru,
Insert     .. je nastaven md "Insert",
Indent     .. je zapnut pepna "Autoindent", 
               tzn. je nastavena automatick indentace,
Tab        .. je nastaven md "Tab",
Fill       .. je zapnut pepna "Optimal fill",
Unindent   .. je zapnut pepna "Unindent", kter uruje
                funkci klvesy Baskspace,
C:NAME.EXT .. drive, jmno a rozen editovanho souboru;
                objev-li se ped tmto dajem znak "*",
                znamen to, e byl soubor od poslednho 
                uloen na disk modifikovn;
               nebylo-li jmno souboru dosud specifikovno,
                je nzev souboru NONAME.PAS.


4.1.1. Zkladn pkazy

     Zkladn pkazy editoru slou k ovldn pohybu kurzoru, 
vkldn a mazn dk, slov a znak editovanho textu.

Zkladn pkazy pro pohyb kurzoru

Pkazy pro pohyb kurzoru v horizontlnm smru:

     Ctrl S  resp. ipka vlevo 
      Zpsob pohyb kurzoru o jeden znak vlevo.

     CTRL-D  resp. ipka vpravo 
      Zpsob pohyb kurzoru o jeden znak vpravo.

     Ctrl-QS  resp. Home
      Posune kurzor na zatek dky, tj. do prvnho sloupce.

     Ctrl-QD  resp. End
      Posune kurzor za posledn nemezerov znak na dce.

     Ctrl-A  resp. Ctrl-ipka vlevo 
      Posune kurzor na prvn psmeno slova, kter je vlevo od  
      kurzoru.

     Ctrl-F  resp. Ctrl-ipka vpravo 
      Posune kurzor na prvn psmeno slova, kter je vpravo od 
      kurzoru.


Pkazy pro pohyb kurzoru ve vertiklnm smru:

     Ctrl-E  resp. ipka nahoru
      Posune kurzor o jeden dek nahoru.

     Ctrl-X  resp. ipka dol
      Posune kurzor o jeden dek dol.

     Ctrl-QE  resp. Ctrl-Home
      Posune kurzor na prvn dek obrazovky.

     CTRL-QX  resp. Ctrl-End
      Posune kurzor na posledn dek obrazovky.

     Ctrl-R  resp. PgUp
      Posune kurzor o celou obrazovku vzhru.

     Ctrl-C  resp. PgDn
      Posune kurzor o celou obrazovku dol.


Dal pkazy pro pohyb kurzoru:

     Ctrl-QR  resp. Ctrl-PgUp
      Posune kurzor na prvn dek souboru.

     Ctrl-QC  resp. Ctrl-PgDn
      Posune kurzor na posledn dek souboru.

     Ctrl-QP
      Posune kurzor na jeho pedchoz pozici.

     Ctrl-QW
      Posune kurzor na pozici, na n byla pi kompilaci
      nalezena posledn chyba.


Zkladn pkazy pro vkldn a mazn textu

Mazn znak
     Ctrl-H  resp. Backspace
      Smae znak vlevo od kurzoru a text, kter je vpravo od
      smazanho znaku, posune i s kurzorem o jednu pozici
      vlevo. Tmto pkazem lze odstranit tak oznaen konce
      dku (CRLF).
     Ctrl-G  resp. Del
      Smae znak na pozici kurzoru a text, kter je vpravo od
      kurzoru, posune o jednu pozici vlevo. Tmto pkazem lze
      odstranit i oznaen konce dku.

Vkldn dky
     Ctrl-N
      Vlo ped pozici kurzoru znak konce dky; dka je tedy
      rozdlena na dv.

Obnoven dky
     Ctrl-QL
      Zru vechny zmny proveden v dan dce od okamiku  
      poslednho umstn kurzoru na tuto dku. Po pesunut  
      kurzoru na jin dek ji pkaz neprovede nic.

Mazn dky
     Ctrl-Y
      Smae dek  obsahujc kurzor a dky pod nm posune o
      jeden dek nahoru. Pozor, smazan dek ji nelze znovu
      obnovit.
     Ctrl-QY
      Smae vechny znaky od pozice kurzoru a do konce dku.

Mazn slova
     Ctrl-T
      Smae slovo, kter je vpravo od kurzoru. Pkaz povauje
      za slovo i oznaen konce dku a posloupnost mezer, lze
      ho tedy pouvat pro spojen dvou dk nebo pro spojen
      textu oddlenho mezerami na jednom dku.


4.1.2. Pkazy pro prci s bloky

     Blokov pkazy umouj pracovat s editovanm textem po
blocch.  Textov blok  je libovoln st  textu, kter je
ohranien oznaenmi "zatek bloku" a "konec bloku". V danm
textu  me bt  v kadm okamiku  oznaen pouze jeden blok. 
Oznaen blok lze  koprovat  i pesunovat  na jin msto     
v textu, mazat, poppad zapisovat do souboru na disk.

     st textu ozname jako blok nsledujcm zpsobem:
Ped prvn znak bloku umstme pomoc pkazu  Ctrl-KB oznae-
n "zatek bloku" a za posledn znak bloku pomoc pkazu    
Ctrl-KK  oznaen "konec bloku". Oznaen  blok je v textu
zvraznn (je zobrazen jinou intenzitou a barvou ne zbvajc
st textu).

Oznaen zatku bloku
     Ctrl-KB
      Ozna zatek bloku. Toto oznaen samotn nen v textu
      vidt. Blok je zvraznn a po oznaen konce bloku.

Oznaen konce bloku
     Ctrl-KK
      Ozna konec bloku. Toto oznaen nen v textu vidt.    
      Blok je zvraznn jen tehdy, byl-li pedtm oznaen i
      zatek bloku.

Oznaen jednoho slova
     Ctrl-KT
      Ozna slovo, na nm je kurzor, jako blok. Pokud nen
      kurzor umstn na dnm slov, je oznaeno prvn slovo  
      vlevo od kurzoru.

Pepna zvraznn bloku v textu
     Ctrl-KH
      Pkaz slou ke pepnn zpsobu zobrazen oznaenho
      bloku. Zpsoby zobrazen oznaenho bloku v textu jsou
      dva:
      -  blok je v textu zvraznn,
      -  blok nen v textu zvraznn (je zobrazen stejn jako
         zbvajc st textu).

Pesun kurzoru na zatek resp. konec bloku
     Ctrl-QB
      Posune kurzor na zatek bloku.
     Ctrl-QK
      Posune kurzor na konec bloku.
   Oba pkazy lze pout i v ppad, e blok nen v textu
   zvraznn.

Tisk bloku
     Ctrl-KP
      Vytiskne oznaen blok (na LPT1).

Koprovn bloku
     Ctrl-KC
      Zkopruje oznaen blok na pozici kurzoru.
      Pokud nen dn blok oznaen  nebo  oznaen blok nen 
      zvraznn, nevyvol tento pkaz dnou akci. Stejn tak 
      se nestane nic v ppad, je-li kurzor umstn uvnit   
      bloku.

Vymazn bloku
     Ctrl-KY
      Vymae oznaen blok. Pozor, po proveden tohoto pkazu 
      ji nelze vymazan blok dnm zpsobem obnovit.
      Pokud nen oznaen dn blok nebo oznaen blok nen    
      zvraznn, nevyvol tento pkaz dnou akci.

Pesun bloku
     Ctrl-KV
      Pesune oznaen blok z jeho pvodnho msta na pozici
      kurzoru.
      Pokud nen dn blok oznaen nebo oznaen blok nen  
      zvraznn, nevyvol tento pkaz dnou akci. Stejn tak
      se nestane nic v ppad, je-li kurzor umstn uvnit
      bloku.

Zpis bloku do souboru na disk
     Ctrl-KW
      Pkaz zkopruje oznaen blok do souboru na disk.
      Koprovan blok zstane v editovanm souboru i nadle    
      oznaen.
      Po odesln pkazu pod editor o zadn jmna souboru,
      do nho m bt blok zapsn. Pokud nen specifikovno
      rozen souboru, je automaticky dosazeno rozen 
      .PAS (nem-li mt soubor dn rozen, je teba za
      jmno souboru napsat teku). Jestlie soubor s tmto 
      jmnem ji existuje, editor na to upozorn a obsah
      existujcho souboru pepe pouze s explicitnm
      souhlasem.
      Pokud nen dn blok oznaen nebo oznaen blok nen    
      zvraznn, nevyvol tento pkaz dnou akci.

Naten bloku ze souboru na disku
     Ctrl-KR
      Po odesln tohoto pkazu pod editor o zadn jmna
      souboru, jeho obsah m bt naten do editovanho textu.
      Pokud neni specifikovno rozen souboru, je automatic-
      ticky dosazeno rozen .PAS (nem-li soubor dn
      rozen, je teba za jmno souboru napsat teku).
      Pkaz zkopruje obsah zadanho souboru do editovanho 
      textu na pozici kurzoru, ozna ho jako blok a zvrazn.

Indentace bloku
     Ctrl-KI
      Posune oznaen blok o jeden sloupec doprava. Nen-li    
      kurzor umstn uvnit bloku, neprovede pkaz nic.
     Ctrl-KU
      Posune oznaen blok o jeden sloupec doleva. Nen-li  
      kurzor umstn uvnit bloku, neprovede pkaz nic.


4.1.3. Pepnae editoru

Pepna md "Insert" a "Overwrite"
     Ctrl-V  resp. Ins
      Slou k pepnn mezi dvma zkladnmi mdy editoru,   
      mdy "Insert" a "Overwrite". Aktivn md je zobrazen ve
      stavovm dku editoru.

Pepna nastaven "Tab" mdu
     Ctrl-OT  resp. Ctrl-QT
      Slou k zapnn a vypnn mdu "Tab", kter umouje
      pracovat s pevn nastavenm tabultorem.
      Je-li md zapnut, je informace o tom zobrazena ve
      stavovm dku editoru a po kadm stisknut klvesy Tab 
      resp. Ctrl-I je do textu vloen tabultor.
      Je-li md "Tab" vypnut, posouv se kurzor po stisknut 
      klvesy Tab resp. Ctrl-I do nejbliho sloupce vpravo, v
      nm na pedchozm dku zan dal slovo.

Pepna "Autoindent"
     Ctrl-OI  resp.  Ctrl-QI
      Je-li zapnut, zpsobuje automatickou indentaci
      nsledujc vkldan dky. Kurzor se pi vkldn nov
      dky neumst do prvnho sloupce dky nsledujc, ale
      do sloupce, ve kterm je prvn nemezerov znak opoutn
      dky. Ve stavovm dku je zobrazena zprva Indent. 
      Je-li pepna vypnut, je pi vkldn nov dky kurzor
      umstn vdy do prvnho sloupce nsledujc dky.
      Implicitn je tento pepna zapnut.




Pepna "Unindent"
     Ctrl-OU
      d inek klvesy Backspace pi mazn zatk dek,
      kter vznikly automatickou indentac.
      Je-li pepna vypnut, je po stisknut klvesy Backspace
      pi mazn indentovanho seku text na dce, kter
      zan na pozici kurzoru, posunut vdy o jednu pozici
      vlevo.
      Je-li pepna zapnut, je po stisknut klvesy Backspace
      pi mazn indentovanho seku text na rdce, kter
      zan na pozici kurzoru, posunut vlevo do sloupce, do
      nho byla odsazena nejbli pedchoz dka, jej
      indentace je men ne indentace dky, na kter je
      umstn kurzor (mazn je tedy rychlej). Zprva o
      zapnut pepnae je zobrazena ve stavovm dku editoru.
      Implicitn je zapnut.

Pepna "Optimal fill"
     Ctrl-OF
      Nem dn efekt, pokud nen nastaven md "Tab".
      Je-li pepna zapnut a souasn nastaven md "Tab" je
      zatek kad automaticky indentovan dky optimln
      vyplnn tabultory a mezerami, tj. tak, e dka obsahuje
      minimln poet znak. Implicitn je pepna vypnut.

Poznmka: Implicitn nastaven pepna editoru lze zmnit
pomoc programu TINST (viz 4.7.1).


4.1.4. Speciln pkazy

     Speciln pkazy editoru  umouj rychl vyhledvn v
textu, zajiuj spoluprci editoru s integrovanm systmem a
dal speciln sluby.

Uloen editovanho souboru na disk
     Ctrl-KS  resp. F2
      Podrobnji viz pkaz File/Save integrovanho systmu.

Vskok z editoru do hlavnho menu bez uloen editovanho
souboru na disk
     F10
     Ctrl-KD  resp. Ctrl-KQ

Zaveden souboru do editoru
     F3
      Pkaz zpsob zaveden oznaenho souboru do editoru.   
      Umouje tedy jednak editovat existujc soubor, jednak  
      vytvoit soubor nov. Podrobnji viz pkaz File/Load
      integrovanho systmu.
Rolovn obrazovky
     Ctrl-W
      Zpsob rolovn obrazovky o jeden dek dol. 
     Ctrl-Z
      Zpsob rolovn obrazovky o jeden dek nahoru.


Prefix dcch znak
     Ctrl-P
      Umouje vkldat do editovanho textu dc znaky (znaky
      s ASCII kdem z intervalu 0 a 31). Ped zadnm kadho
      dcho znaku je teba nejprve stisknout prefix Ctrl-P a
      teprve pak pslun dc znak. V textu jsou dc
      znaky zobrazeny odlinou barvou.

Hledn znakovho etzce
     Ctrl-QF
      Po odesln tohoto pkazu pod editor o zadn
      hledanho etzce. etzec me bt dlouh a 30 znak a
      me  obsahovat libovoln znaky vetn dcch znak
      (zadanch s prefixem Ctrl-P).
      Speciln vznam mj dc znaky  Ctrl-MJ  a  Ctrl-A.  
      dc znak  Ctrl-MJ  je  oznaenm konce dky. Znak    
      Ctrl-A me bt umstn v zadvanm etzci msto
      libovolnch znak, editor pak hled v textu etzce,
      kter se od zadanho etzce li pouze tmito znaky.
      Zadvan etzec je mono editovat pomoc klves
      Backspace, Del a pkaz Ctrl-S, Ctrl-D, Ctrl-A, Ctrl-F a
      jejich ekvivalent. Po zadn etzce lze specifikovat
      libovoln z nsledujcch vyhledvacch podmnek:

          B    Editor hled prvn vskyt zadanho etzece od
            pozice kurzoru smrem k zatku textu.

          G    Editor hled prvn vskyt zadanho etzece od
            pozice kurzoru smrem ke konci textu.

          L    Lokln prohledvn textu. Editor hled prvn
            vskyt zadanho etzce v oznaenm bloku ponaje
            pozic kurzoru. Kurzor mus bt umstn uvnit
            bloku.

          n    Pokud je  n  kladn cel slo, hled editor n-t
            vskyt zadanho etzce od pozice kurzoru ponaje.

          U    Editor pi hledn ignoruje rozdl mezi malmi a
            velkmi psmeny.

          W    Editor hled jen cel slova, tj. peskakuje slova 
            obsahujc hledan etzec jako svou vlastn st.

      Pklad:
         BU3   Editor hled tet vskyt zadanho etzce od
               pozice kurzoru smrem k zatku textu a ignoruje
               rozdly mezi malmi a velkmi psmeny.

      Editor zane zadan etzec hledat po odesln seznamu 
      vyhledvacch podmnek. Je-li odesln przdn seznam,    
      hled editor prvn vskyt zadanho etzce ponaje
      pozic kurzoru.
      Provdn pkazu je mon bhem zadvn etzce nebo   
      vyhledvacch podmnek kdykoliv peruit stisknutm      
      Ctrl-U. Hledn lze libovolnkrt opakovat pomoc pkazu
      Ctrl-L.

Nalezen a pepsn znakovho etzce
     Ctrl-QA
      Pkaz Ctrl-QA je podobn pkazu  Ctrl-QF. Po nalezen  
      zadanho etzce vak tento etzec pepe etzcem     
      novm. Vstupem pkazu je hledan etzec, nov etzec a
      seznam podmnek. Hledan i nov etzec se zadvaj
      stejnm zpsobem jako etzec v pkaze  Ctrl-QF.        
      Podmnky se li od vyhledvacch podmnek pkazu       
      Ctrl-QF jen v nsledujcch volbch:

      N     Editor pepisuje nalezen etzec automaticky
            (bez explicitnho souhlasu). Nen-li tato pod-
            mnka uvedena, d editor ped pepsnm kad-
            ho etzce o souhlas.

          G    Globln prohledvn textu. Editor vyhled a
            poppad pepe vechny vskyty zadanho etzce
            v textu bez ohledu na pozici kurzoru. Hledn
            zan od zatku souboru.

          L  Editor vyhled a poppad pepe ty vskyty
            hledanho etzce, kter le uvnit oznaenho
            bloku. Zan vdy na zatku bloku.

          n  Pokud je  n  kladn cel slo, editor vyhled a
            poppad pepe nsledujcch  n  vskyt
            hledanho etzce etzcem novm. Tato podmnka je
            ignorovna, je-li pouita v kombinaci s volbou G.

      Editor zane pkaz provdt po odesln seznamu
      podmnek. Je-li odesln przdn seznam, editor najde a
      poppad pepe prvn vskyt hledanho etzce od
      pozice kurzoru ponaje.
      Provdn pkazu je mon peruit kdykoliv bhem
      zadvn etzc nebo podmnek stisknutm klvesy Esc
      nebo Ctrl-U. Celou operaci pak lze libovolnkrt opakovat
      pomoc pkazu Ctrl-L.

Peruen pkazu
     Ctrl-U
      Umouje peruit provdn libovolnho pkazu v
      okamiku, kdy tento pkaz ek na vstup. Tk se tedy
      pkaz  Ctrl-KW, Ctrl-KR, Ctrl-QF, Ctrl-QA.

Opakovn posledn operace vyvolan pkazem Ctrl-QF
resp. Ctrl-QA
     Ctrl-L
Nastaven znaky
     Ctrl-Kn
      Pkaz umouje oznait v textu tyi msta, na n pak
      lze rychle pesunout kurzor pomoc  Ctrl-Qn; n je cel
      slo z intevalu  0..3.

Pesun na znaku
     Ctrl-Qn
      Zpsob rychl pesun kurzoru na msto oznaen pkazem 
      Ctrl-Qn; n je cel slo z intervalu  0..3. Nen-li
      odpovdajc znaka nastavena, kurzor se pesune na
      zatek editovanho souboru.

Kontrola zvorek
     Ctrl-Q[  resp. Ctrl-Q]
      Pkaz posune kurzor na odpovdajc zvorku, tj. {, [,
      (*, ", ', <, >, *), ]  nebo  }.  Kurzor mus bt umstn 
      ped zvorkou, jej protjek hledme. Jedn-li se o
      dvojici  (*  *), je teba kurzor umstit na  (  nebo  ). 
      Pokud nen odpovdajc zvorka nalezena, zstane kurzor
      na svm mst.
      Pkaz lze pout pro kontrolu korektnosti zpisu zvorek
      pi jejich vcerovovm vnoen nebo pro rychl posun
      kurzoru pes text uzaven v zvorkch.
      Pro dvojice (*  *), { }, [ ]  a  < >  jsou  pkazy
      Ctrl-Q[  a  Ctrl-Q]  ekvivalentn. V ppad  "  a  ' 
      zvis na volb pkazu smr hledn. Pkaz Ctrl-Q[
      hled v texu smrem dopedu, Ctrl-Q] dozadu.

Vloen direktiv kompiltoru
     Ctrl-OO
      Pkaz vlo na zatek editovanho souboru etzec
      aktivnch direktiv kompiltoru (viz 4.3.3), nap.

         {$A+,B-,D+,E+,F-,I+,L+,N-,O-,R-,S+,V+}
         {$M 16384,0,655360}

Informace o jazyce PurePascal 5.5
     Ctrl-F1
      Umouje vyvolat help jazyka PurePascal vztahujc se ke
      slovu, na nm je v textu umstn kurzor.


4.1.5. Pepnae a parametry IS tkajc se prce s editorem

     Zpsob prce s editorem lze ovlivnit pomoc nsledujcch
pepna IS:  
          Options/Environment/Edit auto save,
          Options/Environment/Backup files,
          Options/Environment/Zoom windows,
          Options/Environment/Screen size

a pomoc parametru Options/Environment/Tab size.

Options/Environment/Edit auto save (On/Off)

     Je-li tento pepna nastaven na On, je soubor zaveden do
editoru, pokud byl od poslednho uloen modifikovn,
automaticky uloen na disk pi vyvoln jakhokoliv z pkaz
Run/Run, Run/Step over, Run/Trace into, Run/Go to cursor a
File/OS shell.
     Pokud je pepna nastaven na Off, je editovan soubor
uloen pouze po vyvoln pkazu File/Save.
     Implicitn nastaven je Off.




Options/Environment/Backup files (On/Off)

     Je-li pepna nastaven na On, vytv IS pi ukldn
editovanho souboru na disk jeho zlon kopii. Zlon kopie
(tj. star verze editovanho souboru) je uloena do souboru,
jeho jmno je a na rozen shodn se jmnem souboru
zavedenm do editoru. Rozen zlonch soubor je .BAK.
     Je-li pepna nastaven na Off, IS zlon kopie editovanch
soubor nevytv.
     Implicitn nastaven je On.

Options/Environment/Zoom windows (On/Off)

     Pepna uruje poet oken zobrazench na obrazovce IS.
     Je-li nastaven na Off, jsou na obrazovce IS zobrazena dv
okna: okno "Edit" a jedno z oken "Watch" a "Output".
     Pi nastaven na On je aktivn okno rozeno na celou
obrazovku (zmnu aktivnho okna lze provst stisknutm klvesy
F6).
     Implicitn nastaven je Off.

Options/Environment/Screen size (25 line display/
                                 43/50 line display)
     Tento pepna umouje nastavit hustotu dek v okn
"Edit". Je mon si vybrat mezi standardnm 25-dkovm
zobrazenm a 43-dkovm EGA zobrazenm resp. 50-dkovm VGA
zobrazenm. Volba 43/50 line display je dostupn pouze na
hardware, kter tento druh zobrazen podporuje.
     Implicitn nastaven je 25 line display.

Options/Environment/Tab size

     Tento parametr slou k nastaven velikosti tabultoru.
Velikost tabultoru editoru IS me bt 2 a 16 znak.
Implicitn je 8 znak. Parametr se zadv do zobrazenho
vstupnho pole.

Poznmka: Implicitn nastaven uvedench pepna a parametru
Options/Environment/Tab size lze zmnit pomoc programu TINST
(viz 4.7.1).


4.1.6. Omezen editoru

     Soubor zpracovvan editorem me mt maximln 64 KByte
textu. dky mohou bt dlouh maximln 248 znak a text me
obsahovat libovoln znak ASCII tabulky vetn dcch znak
(viz ploha A).

     Poznmka: Peklada Pure Pascalu rozeznv jen znaky
umstn v prvnch 126 sloupcch dky.

Dal poznmka: Je-li pota vybaven pdavnou pamt (EMeSs),
pouv editor 64KByte tto pamti pro svj textov buffer.
Zprva o tom je uvedena ve tvrtm dku informanho pole,
kter je zobrazeno po vyvoln pkazu Compile/Get info.
Pouvn pdavn pamti lze potlait pomoc programu TINST,
nastavenm pepnae "Make Use of EMeSs Memory" na Off).


4.2. Spoluprce s operanm systmem

     Pro spoluprci integrovanho systmu s DOSem jsou ureny
pkazy menu "File", kter umouj zavst do editoru soubor
uloen na disku, vytvoit nov soubor, uloit soubor zaveden
do editoru na disk, zobrazit obsah jednotlivch adres,
zmnit aktuln adres, peruit prci v IS a doasn se
vrtit do DOSu a ukonit prci v IS.


4.2.1. Aktuln adres

     Aktuln adres je zobrazen ve vstupnm poli po vyvoln
pkazu File/Change dir. Je-li aktulnm adresem napklad
C:\TPAS, vypad vstupn pole takto:

           New Directory Ŀ
           C:\TPAS                            
          

Zadme-li do vstupnho pole nzev jinho adrese, stane se
zadan adres adresem aktulnm. Pokud zadan adres
neexistuje, je zobrazeno pole s chybovou hlkou:

              Error ͻ
              Path not found.  Press ESC. 
             ͼ

IS provdn pkazu peru a po stisknut Esc normln
pokrauje v prci.

     Nzev aktulnho adrese je uveden tak v prvnm dku
informanho pole, kter lze vyvolat pkazem Compile/Get info.

 Information ͻ
                                                         
  Current directory : C:\TPAS                            
  Current file      : C:\NONAME.PAS                      
  File size         : 0 (Max: 64613)                     
  EMeSs usage         : 0K                                 
  ...                                                    


4.2.2. Zaveden souboru do editoru

     Pro zaveden existujcho souboru do editoru slou pkazy:

          File/Load  resp. F2
          File/Directory
          File/Pick  resp. Alt-F3


Pkaz File/Load (F2)

     Po vyvoln tohoto pkazu se na obrazovce objev vstupn
pole

        Load File Name Ŀ
        *.PAS                                    
       

     Zadme-li do vstupnho pole jmno existujcho souboru (lze
uvst tak  adres; nen-li adres uveden, pedpokld IS, e
je soubor uloen v aktulnm adresi), je tento soubor zaveden
do editoru a zobrazen v okn "Edit". Pokud nen soubor se
zadanm jmnem nalezen, objev se przdn okno "Edit" a IS nm
umon tento soubor vytvoit.

     Odeleme-li ze vstupnho pole oznaen skupiny soubor typu
*.*, je zobrazeno pole, v nm je uveden obsah adrese
specifikovanho tmto oznaenm (nebyl-li oznaenm skupiny
soubor dn adres specifikovn, je zobrazen obsah
aktulnho adrese):

 C:\TPAS\*.* Ŀ
 BINOBJ.PRG     GREP.COM       INSTALL.PRG    MAKE.PRG     
 README.        README.COM     THELP.COM      TINST.PRG    
 TINSTXFR.PRG   TOUCH.COM      TOUR.PRG       TPC.CFG      
 TPC.PRG        TPCONFIG.PRG   TPTOUR1.CBT    TPTOUR2.CBT  
 TPUMOVER.PRG   PURE.PRG      PURE.HLP      PURE.PCK    
 PURE.TPL      PURE.TPX      UNPACK.COM     DOC\         
 ERM\           EXAMPLES\      GRAPH\         OOP_EX\      
 PURE3\        ..\                                        


     Obsah adrese zobrazen v poli tvo dva seznamy. Nejprve
je uveden seznam jmen soubor uloench v tomto adresi (jmna
soubor jsou po dcch lexikograficky uspodna), nsleduje
seznam podadres danho adrese (jmna podadres kon
znakem \ a jsou opt po dcch lexikograficky uspodna) a
oznaen ..\ pro nadazen adres. 
     Pomoc klves se ipkami a klves PgDn, PgUp, Home, End lze
v seznamech oznait a pomoc klvesy Enter vybrat libovoln
soubor nebo adres. Je-li vybrn soubor, je zaveden do
editoru. Je-li vybrn ares, je zobrazeno pole s obsahem
tohoto adrese a celou operaci lze opakovat.
     Oznaen souboru v seznamu lze provst tak stisknutm
klvesy odpovdajc prvnmu znaku jmna souboru. Stiskneme-li
nap. klvesu T, je v seznamu oznaen prvn soubor, jeho jmno
zan psmenem T. Po dalm stisknut klvesy T je oznaen
druh soubor, jeho jmno zan na T atd. Podobnm zpsobem
lze postupovat i pi oznaovn adres, s tm rozdlem, e
stiskneme souasn klvesu odpovdajc prvnmu znaku jmna
adrese a klvesu Shift.
     Stiskneme-li v okamiku, kdy je zobrazeno pole s obsahem
adrese klvesu F4, umo nm IS zadat jin oznaen skupiny
soubor a pot zobraz pole s odpovdajcm obsahem.

     Pokud ze vstupnho pole odeleme oznaen skupiny soubor,
kter je jinho typu ne *.*, bude seznam soubor obsahovat
pouze soubory vyhovujc podmnce uren tmto oznaenm. V
ppad "naeho" adrese C:\TPAS se po zadn oznaen

                   C:\TPAS\*.PRG 

objev pole

 C:\TPAS\*.PRG Ŀ
 BINOBJ.PRG     INSTALL.PRG    MAKE.PRG       TINST.PRG    
 TINSTXFR.PRG   TOUR.PRG       TPC.PRG        TPCONFIG.PRG 
 TPUMOVER.PRG   PURE.PRG      DOC\           ERM\         
 EXAMPLES\      GRAPH\         OOP_EX\        PURE3\      
 ..\                                                       


     Jestlie adres uren oznaenm skupiny soubor, kter
bylo odeslno ze vstupnho pole, neexistuje, je zobrazeno pole
s chybovou hlkou:

         Error ͻ
         Invalid drive or directory.  Press ESC. 
        ͼ

IS provdn pkazu peru a po stisknut Esc normln
pokrauje v prci.

     Pokud byl ped vyvolnm pkazu File/Load zaveden do
editoru soubor (nap.PROG.PAS), kter byl modifikovn, ale
nebyl uloen, IS na to upozorn:

         Verify ͻ
         \TPAS\PROG.PAS  not saved.  Save? (Y/N) 
        ͼ

a umon tento soubor dodaten uloit (m asto zamez
bolestnm ztrtm).


Pkaz File/Directory

     Tento pkaz pracuje stejn jako pkaz File/Load, li se
pouze hlavikou vstupnho pole, je je zobrazeno po jeho
vyvoln:

         Enter File Name Ŀ
         *.*                                      
        


Pkaz File/Pick (Alt-F3)

     Pkaz umouje zavst do editoru soubor na zklad vbru z
tzv. PICK seznamu, kter obsahuje osm naposledy editovanch
soubor. PICK seznam je zobrazen po zadn pkazu a me
vypadat nap. takto:

               Recent file   Ŀ   
               SOUBOR1.PAS             
               SOUBOR2.PAS             
               PASCAL\TEST.PAS         
               PASCAL\PROG.PAS         
               A:\DOK\POPIS.TXT        
               A:\DOK\OBRAZ.TXT        
               SOUBOR3.PAS             
               NONAME.PAS              
                -- load file --        
                 

Prvn soubor PICK seznamu je soubor, kter je prv zaveden do
editoru, druh soubor seznamu je soubor, kter byl zaveden do
editoru bezprostedn ped prvnm souborem atd. 

     V PICK seznamu lze pomoc klves ipka nahoru, ipka dol
oznait libovoln soubor. Oznaen soubor je po stisknut Enter
zaveden do editoru. Nen-li soubor, kter chceme zavst do
editoru, v PICK seznamu uveden, je mon zvolit posledn
poloku seznamu, "-- load file --". Vbr tto poloky je
ekvivalentn pkazu File/Load.

     IS umouje pracovat s vtm potem PICK seznam; o tom si
vak povme a v odstavci 4.6.1.


4.2.3. Vytvoen novho souboru

     Pro vytvoen novho souboru v editoru slou pkazy 

          File/New
          File/Load  resp. F3


Pkaz File/New

     Pkaz  zavede  do editoru  przdn  soubor  se  jmnem
NONAME.PAS. Pi ukldn souboru na disk umon IS jmno
souboru zmnit (viz pkaz File/Save).


Pkaz File/Load (F3)

     Pkaz zavede do editoru przdn soubor, pokud je do
vstupnho pole pkazu zadno jmno neexistujcho souboru.


4.2.4. Uloen souboru na disk

     Soubor zaveden do editoru lze uloit na disk pomoc pkaz

          File/Save  resp. F2
          File/Write to




Pkaz File/Save (F2)

     Pkaz ulo soubor zaveden do editoru na disk. Byl-li
tento soubor prv vytvoen pomoc pkazu File/New (m
implicitn jmno NONAME.PAS), objev se ped uloenm souboru
na disk vstupn pole

         Rename NONAME Ŀ
         C:\NONAME.PAS                            
        

kter umouje jmno souboru zmnit. Pokud je do vstupnho pole
zadno jmno souboru, kter ji existuje, IS na to upozorn:

                Verify ͻ
                Overwrite PROG.PAS? (Y/N) 
               ͼ

a obsah tohoto souboru pepe pouze s explicitnm souhlasem.

     Pokud nen ukldn soubor, jen byl prv vytvoen pomoc
pkazu File/New, je v ppad, e tento soubor ji na disku
existuje a pepna Options/Enironment/Backup files je nastaven
na On, vytvoena jeho zlon kopie. To znamen, e ped
pepsnm pvodnho obsahu editovanho souboru je tento pvodn
obsah umstn do zlonho souboru, jeho jmno je a na
rozen .BAK shodn se jmnem editovanho souboru.


Pkaz File/Write to

     Po vyvoln tohoto pkazu se objev vstupn pole

        New Name Ŀ
                                                 
       

Pkaz zkopruje soubor zaveden do editoru na disk do souboru,
jeho jmno bylo odeslno ze vstupnho pole. Pokud soubor s
tmto jmnem ji na disku existuje, IS na to upozorn a obsah
souboru pepe jen s explicitnm souhlasem.


Pkaz File/Quit

     Tento pkaz ukon prci v IS a zpsob nvrat do DOSu.
Pokud je v okamiku vyvoln pkazu File/Quit zaveden do
editoru soubor, kter byl modifikovn, ale nebyl dosud uloen,
IS na to upozorn a umon tento soubor dodaten uloit.


4.3. Peklad

     Pure Pascal umouje separtn kompilaci program, to
znamen, e kad program je mono rozdlit na "sti", kter
lze oddlen peloit a pot spojit do vslednho kdu. Tmito
"stmi" mohou bt v Pure Pascalu bu unity nebo object
moduly. 
     Krom toho lze pi psan turbopascalskch program pouvat
tzv. INCLUDE soubor. INCLUDE soubor je soubor, obsahujc
zdrojov (tj. turbopascalsk) kd, kter lze pi pekladu
vkldat do program a unit.


Shrme si nyn, jak mme pi psan program a unit v Pure
Pascalu monosti:

1. Kad program a kad unita me pouvat konstanty, typy,
   promnn, procedury a funkce deklarovan v seku interface
   libovolnch (jinch) unit. 
   Opakovn: Kd kd unity mus bt uloen ve zvltnm
   souboru a prvnch osm znak jmna tohoto souboru se mus
   shodovat se jmnem dan unity.  Jestlie program nebo unita
   vyuv deklarac njakch (jinch) unit, mus bt v
   programu nebo unit tyto unity deklarovny v klauzuli uses
   (viz 6.5).
2. Kad program a kad unita me pouvat jako sv extern
   podprogramy (tj. procedury a funkce deklarovan s direktivou
   external) object moduly. Object moduly jsou uloeny v tzv.
   OBJECT souborech (Intel relocatable object files) a lze je k
   programu nebo unit pipojit pomoc speciln direktivy
   kompiltoru {$L <OBJECT soubor> } (viz 4.3.3, 7.8.2).
3. Kad program a kad unita me pouvat INCLUDE soubory.
   INCLUDE soubory lze do programu nebo do unity vloit pomoc
   speciln direktivy kompiltoru {$I <INCLUDE soubor> } (viz
   4.3.3).


4.3.1. Pekldan soubory

     Pi pekladu a sestavovn programu nebo unity kompiltor
potebuje:

1. Peloen kd vech unit, kter dan program nebo dan unita
   pouv. Tento kd je pro kadou unitu uloen v souboru,
   jeho jmno m prvnch osm znak shodnch se jmnem unity a
   rozen .PPU. 
   Potebn .PPU soubory  mus bt  pi pekladu umstny v
   aktulnm adresi nebo v adresch specifikovanch
   parametrem Options/Directories/Unit directories.
   Poznmka: Jednotliv .PPU soubory mohou bt zahrnuty do
   knihovny unit. Standardn knihovnou unit je soubor
   PURE.TPL, kter implicitn obsahuje unity System, Dos, Crt,
   Printer a  Overlay. Pi sputn kompiltoru jsou
   automaticky unity uloen v PURE.TPL zavedeny do pamti.
   Kadou unitu, kterou pekldan program nebo pekldan
   unita pouv, hled kompiltor nejprve v souboru PURE.TPL,
   teprve pak v pslunm .PPU souboru. Obsah knihovny unit
   lze podle poteby upravit pomoc programu PPUMOVER (viz
   4.7.1).

2. Vechny OBJECT soubory, kter dan program nebo dan unita
   pouv.
   Potebn OBJECT soubory mus bt pi pekladu uloeny v
   aktulnm adresi nebo v adresch specifikovanch
   parametrem Options/Directories/Object directories.

3. Vechny INCLUDE soubory, kter dan program nebo dan unita
   pouv.
   Potebn INCLUDE soubory mus bt pi pekladu uloeny v
   aktulnm adresi nebo v adresch specifikovanch
   parametrem Options/Directories/Include directories.

Pi specifikaci parametr Options/Directories/Unit resp. Object
resp. Include directories se zadvaj do vstupnch pol jmna
adres. Pokud chceme uvst vce adres, je teba jejich
jmna oddlit stednkem, nap.

          \TPAS\PRVNI;\TPAS\DRUHY;\TPAS\TRETI


4.3.2. Peklad a sestaven programu

Parametr Compile/Primary file

     Parametr uruje soubor, se kterm pracuj pkazy
Compile/Make, Compile/Build, Run/Run, Run/Trace into, Run/Step
over a Run/Go to cursor. Nen-li tento parametr specifikovn,
pracuj vechny uveden pkazy se souborem zavedenm do
editoru.

Pepna Compile/Destination (Memory/Disk)

     Tento pepna IS uruje, zda bude strojov kd pekldanho
programu uloen na disk do .PRG souboru nebo zda bude umstn
do operan pamti.
     Je-li pepna nastaven na Memory, je strojov kd
pekldanho programu umstn do pamti. Toto nastaven se
pouv pi ladn programu. 
     Jestlie je pepna nastaven na Disk, je strojov kd
programu uloen na disk do .PRG souboru. Jmno .PRG souboru je
a na rozen shodn se jmnem souboru, kter je specifikovn
parametrem IS Compile/Primary file, nebo nen-li tento parametr
zadn, je jmno .PRG souboru - opt a na rozen - shodn se
jmnem souboru, kter obsahuje zdrojov kd hlavnho programu. 
     Pokud je pekldna unita, je vdy jej peloen kd uloen
do .PPU souboru.

Parametr Options/Directories/Pure directory

     Parametr uruje adres, ve kterm jsou uloeny soubory
PURE.TPL, PURE.HLP, PURE.TP a PURE.PCK. Nen-li tento
parametr specifikovn, hled IS uveden soubory v aktulnm
adresi a pod operanmi systmy 3.x (tj. 3.0 a ve) jet v
adresi, z nho byl IS zaveden do pamti.

Parametr Options/Directories/PRG & PPU directory

     Tento parametr uruje adres, do nho budou umstny
vytven .PRG, .PPU a .MAP soubory. Pokud nen parametr
specifikovn, jsou vytven .PRG, .PPU a .MAP soubory ukldny
do adrese, v nm je nalezen soubor s odpovdajcm zdrojovm
kdem.

Parametr Options/Directories/Include directories

     Parametr uruje adrese, ve kterch jsou uloeny INCLUDE
soubory (jednotliv adrese se zadvaj do vstupnho pole
oddleny stednky). Nen-li tento parametr specifikovn, hled
IS INCLUDE soubory pouze v aktulnm adresi.

Parametr Options/Directories/Unit directories

     Parametr uruje adrese, ve kterch jsou uloeny soubory
obsahujc unity (jednotliv adrese se zadvaj do vstupnho
pole oddleny stednky). Nen-li tento parametr specifikovn,
hled IS soubory s unitami v aktulnm adresi.

Parametr Options/Directories/Object directories

     Parametr uruje adrese, ve kterch jsou uloeny OBJECT
soubory (jednotliv adrese se zadvaj do vstupnho pole
oddleny stednky). Nen-li tento parametr specifikovn, hled
IS OBJECT soubory v aktulnm adresi.

Pkaz Compile/Get info

     Po vyvoln tohoto pkazu je na obrazovce IS zobrazeno pole
s informacemi o pekldanm souboru (viz schma struktury menu
IS na zatku 4.kapitoly).


     Pro peklad a sestaven programu nebo unity jsou ueny
nsledujc pkazy IS:

          Compile/Compile  resp. Alt-F9
          Compile/Make     resp. F9
          Compile/Build



Compile/Build

     Pkaz vyvol peklad a sestaven souboru, kter je
specifikovn parametrem Compile/Primary file. Nen-li tmto
parametrem specifikovn dn soubor, je peloen a sestaven
soubor zaveden do editoru.
     Pokud pekldan program nebo unita pouvaj njak (jin)
unity, jsou vechny tyto unity  znovu peloeny a sestaveny 
(nen-li soubor se zdrojovm kdem unity nalezen, je pouita
existujc verze .PPU souboru).

Compile/Make (F9)

     Pkaz vyvol peklad a sestaven souboru, kter je
specifikovn parametrem Compile/Primary file. Nen-li tmto
parametrem specifikovn dn soubor, je peloen a sestaven
soubor zaveden do editoru.
     Pokud pekldan program nebo unita pouvaj njak (jin)
unity, jsou tyto unity znovu peloeny a setaveny pouze tehdy,
je-li to skuten teba (a je-li nalezen soubor obsahujc
jejich zdrojov kd; nen-li soubor se zdrojovm kdem unity
nalezen, je pouita existujc verze .PPU souboru).

Upesnn: Unitu pouvanou programem nebo jinou unitou je teba
peloit a setavit v tchto ppadech:
-  pokud unita nebyla jet peloena, tj. neexistuje-li jej
   .PPU soubor,
-  pokud byl od okamiku vytvoen .PPU souboru dan unity
   modifikovn jej zdrojov kd nebo nkter z OBJECT a INCLUDE
   soubor, kter unita pouv; byl-li modifikovn sek
   "interface" unity jsou navc znovu peloeny a sestaveny
   vechny unity, kter tuto unitu pouvaj.

Compile/Compile (Alt-F9)

     Pkaz vyvol peklad a sestaven souboru zavedenho do
editoru. Jinak se tento pkaz nim neli od pkazu 
Compile/Make.


4.3.3. Direktivy kompiltoru

     Direktiva kompiltoru je speciln koment umstn ve
zdrojovm kdu, kter uruje nkter vlastnosti kompiltoru.

     Direktivy kompiltoru mus bt uzaveny ve sloench
zvorkch, prvnm znakem uvedenm po uvozovac zvorce { mus
bt $ a bezprostedn za nm mus nsledovat jmno direktivy.

     Pure Pascal m ti typy direktiv kompiltoru:

- direktivy pro nastaven pepna kompiltoru,
- direktivy pro nastaven parametr kompiltoru,
- direktivy pro zen podmnn kompilace (viz 4.3.4).




Direktivy pro nastaven pepna kompiltoru

     Tyto direktivy slou k nastaven jednotlivch pepna
kompiltoru. Pepnae kompiltoru uruj zpsob ukldn
datovch objekt do pamti, zpsob generovn nkterch st
strojovho kdu a mnostv informac generovanch pro ladn
program. 

     Direktivy pro nastaven pepna kompiltoru se dl na
globln a lokln. Globln direktivy se tkaj celho
pekladu, zatmco lokln direktivy maj vliv pouze na sti
pekladu, kter jsou ureny mstem uveden dan direktivy a
mstem dalho vskytu direktivy se stejnm jmnem. Globln
direktivy mus bt pouity ped sekem deklarac programu nebo
unity, tj. ped prvnm vyhrazenm slovem uses, label, const,
type, var, procedure, function resp. begin. Lokln direktivy
mohou bt umstny kdekoliv v programu nebo unit.

     Pepnae kompiltoru jsou uvedeny v menu "Options/Compiler"
a lze je nastavit jak direktivou ve zdrojovm kdu tak pmo v
IS. Je-li pepna nastaven z IS, tk se vdy celho pekladu.
Pouit direktivy ve zdrojovm kdu potlauje nastaven
pslunho pepnae proveden z IS.

     Nastaven pepnae kompiltoru pomoc direktivy je ureno
znakem + nebo -, kter mus bt uveden bezprostedn za jmnem
direktivy, pak me nsledovat koment oddlen aspo jednou
mezerou. Pklad: {$I-   oteven soubor }.

     Chceme-li na jednom mst programu nebo unity pout vt
poet direktiv, lze jmna jednotlivch direktiv a jejich
nastaven zapsat do jedn komentov zvorky, piem znak $
mus bt uveden pouze ped jmnem prvn direktivy, ped jmny
dalch direktiv mus bt rky a mezi uvozovac komentovou
zvorkou a znakem oznaujcm nastaven posledn direktivy
nesm bt dn mezera. Pklad: {$B+,R-,S- }.


Pepnae kompiltoru:

Pepna R: Range checking (On/Off)

Direktiva:  {$R+}  nebo  {$R-}
Typ: lokln
Pepna IS: Options/Compiler/Range checking
Implicitn nastaven: {$R-}  resp. Off

     Pepna zapn resp. vypn generovn kdu pro kontrolu
rozsahu hodnot. 
     Je-li pepna nastaven na On, generuje kompiltor kd, kter
kontroluje:
-  zda jsou vechny indexy promnnch typ array a string v
   povolench mezch,
-  zda jsou hodnoty piazovan promnnm v rozsahu urenm
   typem tchto promnnch,
-  zda je kad instance objektu, kter vol virtuln metodu,
   inicializovan pslunm konstruktorem.
Nen-li nkter z tchto podmnek splnna, dojde k bhov chyb
a provdn programu je perueno.
     Pi vypnut pepnae (Off, direktiva {$R-}) nen kd pro
provdn uvedench kontrol pekladaem generovn. Kd programu
se tedy zmen a bh programu se zrychl. Toto nastaven
pepnae je vak rozumn pouvat a tehdy, je-li program
odladn.


Pepna S: Stack-overflow checking (On/Off) 

Direktiva:  {$S+}  nebo  {$S-}
Typ: lokln
Pepna IS: Options/Compiler/Stack checking
Implicitn nastaven: {$S+}  resp. On

     Pepna zapn resp. vypn generovn kdu pro kontrolu
peteen zsobnku.
     Je-li nastaven na On (direktiva {$S+}), generuje peklada
pro kadou proceduru a funkci kd, kter testuje, zda je v
zsobnku dost msta pro jej lokln promnn a pro dal
daje, kter je teba do zsobnku pi voln procedury nebo
funkce uloit. Pokud pak pi voln njak procedury i funkce
bhem provdn programu nen tento test spn, dojde k bhov
chyb a provdn programu je perueno.
     Pi nastaven pepnae na Off (direktiva {$S-}) nen tento
kd generovn a ppadn peteen zsobnku pak
nejpravdpodobnji zpsob zhroucen systmu.
     Direktiva se obvykle uvd ped volnm procedury i funkce.
Pklad:
     program PROG;
          ...
     procedure PROC;
          begin ... end;
          ...
     begin
          ...
     {$S- }
     PROC;
     {$S+ }
          ...
     end.


Pepna I: Input/Output checking (On/Off)

Direktiva:  {$I+}  nebo  {$I-}
Typ: lokln
Pepna IS: Options/Compiler/I/O checking
Implicitn nastaven: {$I+}  resp. On

     Tento pepna zapn resp. vypn automatick generovn
kdu, kter kontroluje, zda pi provdn vstupnch a vstupnch
operac nedolo k chyb (viz dodatek B.2).
     Pepna je zapnut, je-li nastaven na On (direktiva {$I+}).
Pokud pi tomto nastaven pepnae dolo ke vstupn/vstupn
chyb, provdn programu je perueno a je zobrazena chybov
hlka.
     Pi vypnut pepnae (Off, direktiva {$I-}) negeneruje
kompiltor kd, kter kontroluje spnost vstupnch a
vstupnch operac.


Pepna O: Overlay code generation (On/Off)

Direktiva:  {$O+}  nebo  {$O-}
Typ: globln
Pepna IS: Options/Compiler/Overlays allowed
Implicitn nastaven: {$O-}  resp. Off

     Pepna zapn resp. vypn generovn kdu pro overlay
systm (viz 6.5.3). 
     Pure Pascal umouje pekrvn unit, kter byly peloeny s
tmto pepnaem nastavenm na On (direktiva {$O+}). Samotn
pouit direktivy {$O+} v unit, tj. peklad unity s pepnaem
nastavenm na On, nevyvol pekrvn unity, pouze je umon,
bude-li poadovno.
     Pi nastaven pepnae na Off (direktiva {$O-}) nen kd pro
overlay systm generovn a unity takto peloen nelze pro
pekrvn pout.

Poznmka: Direktiva {$O+} se tm vdy pouv s direktivou
{$F+}, aby se zajistil poadavek FAR zpsobu voln pi
pekrvn (tot samozejm plat pro odpovdajc pepnae).


Pepna A: Align data (Word/Byte)

Direktiva:  {$A+}  nebo  {$A-}
Typ: globln
Pepna IS: Options/Compiler/Align data
Implicitn nastaven: {$A+}  resp. Word

     Tento pepna uruje zpsob zarovnvn (umstn)
promnnch a typovanch konstant v pamti. Pepna me bt
nastaven na Byte nebo Word.
     Pi nastaven pepnae na Word (direktiva {$A+}) jsou
vechny promnn a typovan konstanty, kter jsou vt ne
jeden byte, zarovnvny v pamti na hranici strojovho slova,
tj. na sud adresy. Pi tomto zpsobu ukldn dat do pamti se
alokuj byty, kter nejsou vyuity, pstup k datm je vak
rychlej. Zarovnvn se netk dat velikosti 1 byte ani
poloek zznam a prvk pol.
     Je-li pepna nastaven na Byte (direktiva {$A-}), dn
zarovnvn dat se neprovd. Promnn a typovan konstanty jsou
do pamti umisovny na nejbli monou adresu. et se
pam, ale pstup k datm trv dle.

Poznmka: Bez ohledu na nastaven pepnae zan alokace
pamti pro kad sek deklarac konstant a globlnch promnnch
na hranici strojovho slova. Dle udruje peklada na hranici
strojovho slova stack pointer.


Pepna V: Var-string checking (Strict/Relaxed)

Direktiva:  {$V+}  nebo  {$V-}
Typ: lokln
Pepna IS: Options/Compiler/Var-string checking
Implicitn nastaven: {$V+}  resp. Strict

     Tento pepna uruje zpsob typov kontroly stringovch
promnnch pedvanch jako parametry procedurm a funkcm.
     Je-li pepna nastaven na Strict (direktiva {$V+}), generuje
kompiltor kd, kter vyaduje, aby formln a skuten
stringov parametry volan odkazem byly identickch typ. Pokud
tomu tak nen, dojde k chyb. (Netk se parametr volanch
hodnotou.)
     Je-li pepna nastaven na Relaxed (direktiva {$V-}),
generuje peklada kd, kter umouje pout jako skuten
parametr promnnou libovolnho stringovho typu, i kdy je jej
deklarovan maximln dlka jin ne dlka pslunho
formlnho parametru.
     Direktivu je teba uvst ped volnm pslunho
podprogramu.


Pepna B: Boolean evaluation (Short Circuit/Complex)

Direktiva:  {$B+}  nebo  {$B-}
Typ: lokln
Pepna IS: Options/Compiler/Boolean evaluation
Implicitn nastaven: {$B-}  resp. Short Circuit

     Pepna uruje zpsob generovn kdu pro vyhodnocovn
boolovskch vraz obsahujcch opertory and a or.
     Je-li nastaven pepnae Complex (direktiva {$B-}, generuje
kompiltor kd pro vyhodnocovn celch boolovskch vraz. To
znamen, e je vyhodnocen kad operand boolovskho vrazu
vytvoenho pomoc opertor and a or, a to i kdy je vsledek
vrazu v danm okamiku ji znm.
     Je-li nastaven tohoto pepnae Short Circuit (direktiva
{$B+}), generuje kompiltor kd pro tzv. zkrcen vyhodnocovn
boolovskch vraz, co znamen, e vyhodnocovn boolovskch
vraz utvoench pomoc opertor and a or kon v okamiku,
kdy lze vsledek vrazu urit, piem je vraz vyhodnocovn
zleva doprava. Nap. pi vyhodnocovn vrazu  

     False and Otestuj(i,j)

nebude ji volna funkce Otestuj.


Pepna N: Numeric processing (Software/Hardware)

Direktiva:  {$N+}  nebo  {$N-}
Typ: globln
Pepna IS: Options/Compiler/Numeric processing
Implicitn nastaven: {$N-}  resp. Software

     Tento pepna uruje zpsob generovn kdu pro vpoty v
pohybliv dov rce. 

     Je-li pepna nastaven na Software (direktiva {$N-}),
generuje peklada kd, kter umouje pracovat pouze s 6-
bytovm typem real (rozsah 2.9E-39 a 1.7E38, 11 a 12
signifikantnch slic) a kter provd vechny vpoty s
relnmi sly softwarov pomoc voln rutin ze systmov "run-
time" knihovny.

     Je-li pepna nastaven na Hardware (direktiva {$N+}),
generuje kompiltor kd pro numerick koprocesor 6888?, kter
umouje krom standardnho typu real pouvat dal tyi typy
sel s pohyblivou dovou rkou:

- typ sigle - velikost 4 byty,
              pesnost 1.5E-45, 
              maximln hodnota 3.4E38,
              7 a 8 signifikantnch slic,

- typ double - velikost 8 byt,
               pesnost 5.0E-324,
               maximln hodnota 1.7E308,
               15 a 16 signifikantnch slic,

- typ extended - velikost 10 byt,
                 pesnost 3.4E-4932,
                 maximln hodnota 1.1E4932,
                 19 a 20 signifikantnch slic,

- typ comp - uren pro ukldn hodnot typu integer do 8 byt,
             rozsah piblin -9.2E18 a 9.2E18,
             je povaovn za reln typ, nebo aritmetick
             operace s promnnmi tohoto typu jsou provdny
             pomoc koprocesoru 6888?.

Koprocesor 6888? vyhodnocuje pi vpotech vechny vrazy s
pesnost typu extended (i hodnoty typu real jsou nejprve
pevedeny na hodnoty typu extended. Tak hodnoty funkc unity
System (Sqrt, Pi, Sin atd.) jsou typu extended msto real.

     Nen-li koprocesor 6888? v potai instalovn, lze Pure
Pascal instruovat, aby k programu pilinkoval knihovnu, kter
koprocesor 6888? emuluje (nastavme pepna "Emulation" na On).
Pokud je koprocesor 6888? instalovn je vdy pi nastaven
pepnae N na Hardware pouit (bez ohledu na stav pepnae
"Emulation").

Poznmka: Koprocesor 6888? pouv pro ukldn mezivpot svj
vlastn zsobnk (pstup k hodnotm uloenm v tomto zsobnku
je mnohem rychlej ne pstup k hodnotm uloenm v pamti).
Tento zsobnk je vak pouze osmirovov a pi vyhodnocovn
sloitch relnch vraz, tj. vraz, kter generuj vce ne
osm mezivsledk, me dojt k jeho peteen. Nebezpe hroz
zvlt pi voln rekurzivnch procedur a funkc.

Pklad: (vpoet Fibonacciho sel)

function Fib (N:integer): extended;
begin
     if N = 0 then Fib:= 0.0
     else
          if N = 1 then Fib:= 1.0
          else Fib:= Fib(N-1) + Fib(N-2);
end;

     Pi voln funkce Fib s parametrem N vtm ne 8 dojde k
peteen zsobnku koprocesoru 6888?, nebo posledn piazen 
Fib:= Fib(N-1) + Fib(N-2)  vyaduje doasn uloen hodnoty
Fib(N-1) do zsobnku. Kad rekurzivn voln funkce Fib tedy
zpsob uloen jednoho mezivsledku a pi devt rekurzi dojde
k peteen. 
     Tuto situaci vyeme pouitm pomocnch loklnch promnnch
F1, F2, kter jsou uloeny v "normlnm" zsobnku:

function Fib (N:integer): extended;
var F1,F2: extended;
begin
     if N = 0 then Fib:= 0.0
     else
          if N = 1 then Fib:= 1.0 
          else
               begin 
         F1:= Fib(N-1); F2:= Fib(N-2);
               Fib:= F1 + F2;
               end;
end;

Dal poznmka: Na zatek kadho programu peloenho s
pepnaem "Numeric processing" nastavenm na Hardware je
pipojen kd, kter detekuje existenci koprocesoru 6888? v
potai. Vsledek detekce vetn klasifikace typu tohoto
koprocesoru je uloen v promnn Test6888? deklarovan v unit
System. Promnn me mt po detekci nsledujc hodnoty:

          0 ... koprocesor nen instalovn,
          1 ... je instalovn koprocesor 68881,
          2 ... je instalovn koprocesor 68882,



Pepna E: Emulation (On/Off)

Direktiva:  {$E+}  nebo  {$E-}
Typ: globln
Pepna IS: Options/Compiler/Emulation
Implicitn nastaven: {$E+}  resp. On

     Tento pepna uruje, zda m bt k pekldanmu programu
pilinkovna knihovna, kter emuluje numerick koprocesor 6888?.
Pepna nem dn inek, je-li pouit v unit, m vliv pouze
na kompilaci celho programu.

     Je-li pepna nastaven na On (direktiva {$E+}), je knihovna
pro emulaci koprocesoru 6888? k pekldanmu programu pipojena.
pi nastaven na Off (direktiva {$E-}) nikoli.

     Knihovna pro emulaci koprocesoru 6888? je pi implicitnm
nastaven pepnae automaticky pipojena ke kadmu programu,
kter koprocesor 6888? pouv. Pokud vak vme, e pekldan
program bude vdy provozovn na potai, kter je koprocesorem
vybaven, nen teba, aby k vslednmu kdu programu byla
knihovna pipojena a je vhodn nastavit pepna E na Off.

Poznmka: Je-li program pekldn s pepnaem N nastavenm na
Software (direktiva {$N-}) a byly-li vechny unity, kter
program pouv, tak peloeny s pepnaem N nastavenm na
Software, pak je nastaven pepnae E v programu ignorovno. 

Zvr:
     Chcete-li v programu vyuvat monost, kter poskytuje
numerick koprocesor 6888?, pak program pelote
-  s direktivami {$N+,E+}, pokud v pota nebo nkter
   pota, na kterm m bt program v budoucnosti provozovn,
   nen koprocesorem 6888? vybaven,
-  s direktivami {$N+,E-}, pokud v pota i vechny potae,
   na nich bude program provozovn, koprocesor 6888? maj.
(Msto direktiv lze samozejm pout pslunch pepna IS.)


Pepna D: Debug information (On/Off)

Direktiva:  {$D+}  nebo  {$D-}
Typ: globln
Pepna IS: Options/Compiler/Debug information
Implicitn nastaven: {$D+}  resp. On

     Pepna zapn resp. vypn generovn informac pro
debugger. Tyto informace obsahuj pro kadou proceduru a funkci
tzv. tabulku sel dek, v n jsou pro jednotliv sla dek
zdrojovho kdu dan procedury i funkce uvedeny adresy
odpovdajcho object kdu.

     Je-li pi pekladu programu nebo unity nastaven pepna na
On (direktiva {$D+}), jsou informace potebn pro prci
debuggeru generovny a program nebo unitu lze trasovat,
nastavovat v nich breapointy (viz 4.5) a pro hledn bhovch
chyb uvat pkazu IS Compile/Find error.
     Informace pro debugger generovan pi pekladu unity jsou
ukldny do pslunho .PPU souboru spolu s peloenm kdem
unity. Tyto informace zvtuj velikost .PPU souboru a pi
pekladu program, kter danou unitu pouvaj, zabraj msto v
pamti. Nemaj vak vliv na velikost vslednch .PRG soubor a
na rychlost provdn program. 

     Programy a unity peloen s pepnaem nastavenm na Off
(direktiva {$D-}) nejsou pi ladn pro debugger dosaiteln.

     Pepna "Debug information" se obvykle pouv souasn s
pepnaem "Local symbol information", kter zapn resp. vypn
generovn informac o loklnch symbolech.

Poznmka: Chcete-li pro ladn programu pout Pure Debugger,
nastavte pepna IS Compile/Destination na Disk a pepna
Debug/Stand-alone debugging na On.

Dal poznmka: Pepnae IS Debug/Stand-alone debugging a
Options/Linker/Map file zajiuj vytven kompletn informace
pro Pure Debugger pouze tehdy, pokud byly programy a unity
peloeny s pepnaem "Debug information" nastavenm na On.


Pepna L: Local symbol information (On/Off)

Direktiva:  {$L+}  nebo  {$L-}
Typ: globln
Pepna IS: Options/Compiler/Local symbols
Implicitn nastaven: {$L+}  resp. On

     Pepna zapn resp. vypn generovn informac o loklnch
symbolech pro debugger. Informace o loklnch symbolech obsahuj
jmna a typy vech loklnch promnnch a konstant program a
unit, tj. promnnch a konstant deklarovanch v procedurch a
funkcch a v secch "implementation" unit.

     Je-li pi pekladu programu nebo unity nastaven pepna na
On (direktiva {$L+}), jsou generovny informace o loklnch
symbolech, debugger umouje sledovat a modifikovat hodnoty
loklnch promnnch a sledovat voln procedur a funkc pomoc
pkazu Debug/Call stack (viz 4.4).
     Informace o loklnch symbolech unity jsou ukldny do
pslunho .PPU souboru spolu s peloenm kdem unity. Tyto
informace zvtuj velikost .PPU souboru a pi pekladu
program, kter danou unitu pouvaj, zabraj msto v pamti.
Nemaj vak vliv na velikost vslednch .PRG soubor a na
rychlost provdn program. 

     Lokln symboly program a unit peloench s pepnaem
nastavenm na Off (direktiva {$L-}) nejsou pro debugger
dosaiteln.

     Pepna "Local symbol information" se pouv souasn s
pepnaem "Debug information". Pokud je pepna "Debug
information" nastaven na Off, kompiltor nastaven pepnae
"Local symbol information" ignoruje.

Poznmka: Pepnae IS Debug/Stand-alone debugging a
Options/Linker/Map file zajiuj vytven informace o
loklnch symbolech pro Pure Debugger pouze tehdy, pokud byly
programy a unity peloeny s pepnaem "Local symbol
information" nastavenm na On.


Poznmka ke vem pepnam kompiltoru: Implicitn nastaven
pepna kompiltoru lze zmnit pomoc programu TINST (viz
4.7.1).


Direktivy pro nastaven parametr kompiltoru

     Tyto direktivy specifikuj jmna INCLUDE soubor, .OBJ
soubor a velikost zsobnku a HEAPu. Pi zpisu direktivy se za
jmnem direktivy uvd jeden nebo vce parametr. Seznam
parametr mus bt od jmna direktivy oddlen alespo jednou
mezerou.


Include file

Syntax:  {$I <jmno INCLUDE souboru> }

     Direktiva instruuje kompiltor, aby pi pekladu vloil na
msto, na kterm je uvedena, soubor, jeho jmno je ureno
parametrem direktivy.
     Pokud <jmno INCLUDE souboru> nem dn rozen, je mu
implicitn pidleno rozen .PAS. 
     Jestlie <jmno INCLUDE souboru> neobsahuje adres, hled
kompiltor INCLUDE soubor uren direktivou v aktulnm
adresi; pokud ho nenalezne, prohledv adrese specifikovan
parametrem Options/Directories/Include directories.

Omezen na pouit tto direktivy:
-  Direktiva nesm zpsobit "vnoen" pekladae do vce ne 14
   (u verze 5.0 Pure Pascalu do vce ne 4) INCLUDE soubor,
   nebo peklada me mt v danm okamiku maximln 15 (u
   verze 5.0 maximln 5) otevench vstupnch soubor. Pokud je
   toto omezen porueno, dojde k chyb " 9: To many nested
   files ".
-  Direktiva nesm bt uvedena uvnit bloku. Vechny pkazy
   bloku mus bt v tme zdrojovm souboru. Toto omezen lze
   obejt nap. takto:
          .
          .
     procedure INCLUDE;
     {$I include.pas }
          .
          .
     begin
     ... ; INCLUDE; ...
     end;




Link object file

Syntax:  {$L <jmno OBJECT souboru> } 

     Tato direktiva instruuje kompiltor, aby k pekldanmu
programu i k pekldan unit pilinkoval object modul uloen
v souboru, kter je uren parametrem direktivy.

     Pokud <jmno OBJECT souboru> nem dn rozen, je mu
implicitn pidleno rozen .OBJ. 
     Jestlie <jmno OBJECT souboru> neobsahuje adres, hled
kompiltor OBJECT soubor uren direktivou v aktulnm adresi;
pokud ho nenalezne, prohledv adrese specifikovan parametrem
Options/Directories/Object directories.

Pklad:
          .
          .
     procedure OB_MODUL; external;
     {$L ob_modul.obj }
          .
          .
     begin
     ... ; OB_MODUL; ...
     end;


Memory allocation sizes

Syntax:     {$M <zsobk>,<HEAP_min>,<HEAP_max> }
Implicitn: {$M 16384,0,655360 }

Ekvivalentn pkaz IS: Options/Compiler/Memory sizes

     Direktiva specifikuje nastaven poadavk na pam pro dan
program. Mus bt uvedena na zatku programu ped sekem
deklarac. Pokud je direktiva pouita v unit, nem dn
inek.

     Vechny ti parametry direktivy mus bt cel sla a jejich
vznam je nsledujc:
     <zsobnk> udv velikost zsobnku v bytech (viz 3.7.4),
              mus bt z intevalu  0 .. 655360.
     <HEAP_min> specifikuje minimln velikost HEAPu v bytech 
               (viz 6.1.3),
              mus bt z intervalu  0 .. 655360,
     <HEAP_max> specifikuje maximln velikost HEAPu v bytech
               (opt viz 6.1.3),
              mus bt z intervalu <HEAP_min> .. 655360.
Implicitn hodnoty parametr lze zmnit pomoc programu TINST.


Overlay Unit Name

Syntax: {$O <jmno unity> }

     Direktiva uruje, e unita <jmno unity> bude umstna do
.OVR souboru a bude pekrvna. Unita <jmno unity> mus bt
peloena s pepnaem "Overlay code generation" nastavenm na
On, jinak kompiltor hls chybu.
     Direktiva mus bt umstna v programu za klauzul uses. Je-
li pouita v unit, nem dn inek. 

Poznmka: Pekrvn je vnovn odstavec 6.5.


4.3.4. Podmnn peklad

     V Pure Pascalu lze ve zdrojovm kdu pout konstrukty,
kter umouj podmnn peklad nkterch st zdrojovho
kdu. Tyto konstrukty lze vytvoit pomoc nsledujcch direktiv
kompiltoru:
         {$IFDEF <symbol>}, {$IFNDEF <symbol>},
         {$IFOPT <pepna>},
         {$ELSE}, {$ENDIF}.

     Pro zen podmnn kompilace existuj dva typy konstrukt:

     <specifikace podmnky>  ...  {$ENDIF}    a
     <specifikace podmnky>  ...  {$ELSE}  ...  {$ENDIF} ,

kde   <specifikace podmnky>::=  - {$IFDEF  <symbol> }
                                 - {$IFNDEF <symbol> }
                                 - {$IFOPT <pepna> } .

     Pouit prvnho konstruktu zpsob, e zdrojov kd umstn
mezi direktivami <specifikace podmnky> a {$ENDIF} je peloen
pouze tehdy, je-li splnna podmnka uren direktivou
<specifikace podmnky>.
     Pi pouit druhho konstruktu je v ppad, e je splnna
podmnka uren direktivou <specifikace podmnky>, peloen
zdrojov kd umstn mezi direktivami <specifikace podmnky> a
{$ELSE}, jinak je peloen zdrojov kd mezi direktivami {$ELSE}
a {$ENDIF}.

     Konstrukty podmnn kompilace mohou bt vnoeny a do
hloubky 16. Pro kadou direktivu <specifikace podmnky> mus bt
odpovdajc direktiva {$ENDIF} nalezena uvnit tho zdrojovho
souboru, tj. kad zdrojov soubor mus mt stejn poet
direktiv <specifikace podmnky> a direktiv {$ENDIF}.

     Podmnn kompilace je zaloena na vyhodnocen podmnky
uren nkterou z direktiv <specifikace podmnky>. Existuj dva
typy tchto podmnek:
-  podmnky, kter zvis na existenci podmnkovho symbolu,
-  podmnky, kter zvis na nastaven nkterho pepnae
   kompiltoru.

     K zaveden resp. zruen podmnkovho symbolu slou
direktivy:
          {$DEFINE <symbol>}  a  {$UNDEF <symbol>} .

Pro podmnkov symboly plat stejn syntaktick pravidla jako
pro identifiktory: mus zanat psmenem nebo podtrhovtkem
("_") a mohou obsahovat psmena, slice a podtrhovtka. Dlka
podmnkovch symbol je libovoln, ale pro jejich rozlien m
vznam pouze prvnch 63 znak.

Poznmka: Podmnkov symboly nemaj nic spolenho s
identifiktory - nelze s nimi v programu pracovat jako s
identifiktory.

Pklad:
     {$DEFINE Symbol }
     if Symbol then writeln('Symbol je definovn');

Tento "if"-pkaz zpsob chybu, pokud v programu nen
deklarovna promnn Symbol typu boolean. Podmnkov symbol
definovan direktivou  {$DEFINE Symbol} neze povaovat za
promnnou.

     Dal podmnkov symboly mohou bt definovny ped vyvolnm
pekladu pomoc pkazu IS 

     Options/Compiler/Conditional defines

zadnm do zobrazenho vstupnho pole (jednotliv symboly se
oddluj stednky):

    Defined Symbols Ŀ
    Symbol; CGA                                      
   

nebo pomoc direktivy  {$DEFINE <symbol>}.


Direktivy pro zen podmnn kompilace

Direktiva DEFINE

Syntax: {$DEFINE <symbol>}

     Direktiva definuje podmnkov symbol se jmnem <symbol>.
Symbol <symbol> je definovn tak dlouho, dokud nen pouita
direktiva {$UNDEF <symbol>}.
     Direktiva nem dn inek, je-li symbol <symbol> ji
definovn.






Direktiva UNDEF

Syntax: {$UNDEF <symbol>}

     Direktiva zru dve definovan symbol <symbol>. Nen-li
uveden symbol definovn, nem direktiva dn inek.


Direktiva IFDEF

Syntax: {$IFDEF <symbol>}

     Kompiltor pelo zdrojov kd, kter je uveden mezi touto
direktivou a odpovdajc direktivou {$ELSE} nebo {$ENDIF},
pokud je definovn symbol <symbol>.

Pklad:
{$IFDEF CPU87}
     {$N+}
     type  real = double;
{$ELSE}
     {$N-}
     type  single = real;
           double = real;
           extended = real;
           comp = real;
{$ENDIF}


Direktiva IFNDEF

Syntax: {$IFNDEF <symbol>}

     Kompiltor pelo zdrojov kd, kter je uveden mezi touto
direktivou a odpovdajc direktivou {$ELSE} nebo {$ENDIF},  
pokud symbol <symbol> nen definovn.


Direktiva IFOPT

Syntax: {$IFOPT <pepna>+|-}

     <pepna> obsahuje prvn znak jmna pepnae kompiltoru.
     Kompiltor pelo zdrojov kd, kter je uveden mezi
direktivou {$IFOPT <pepna>+|-} a odpovdajc direktivou
{$ELSE} nebo {$ENDIF}, je-li pepna <pepna> v uvedenm
stavu.

Pklad:
{$IFOPT N+}
     type real = extended;
{$ENDIF}

Deklarace typu bude peloena, pokud nastaven pepnae
odpovd direktiv {$N+}.


Direktiva ELSE

Syntax: {$ELSE}

     Tato direktiva oddluje v seku zdrojovho kdu, kter je
uzaven mezi direktivami <specifikace podmnky> a {$ENDIF},
zdrojov kd, kter bude peloen, a zdrojov kd, kter bude
ignorovn.


Direktiva ENDIF

Syntax: {$ENDIF}

     Direktiva zakonuje podmnnou kompilaci, kter byla zapoata
minulou direktivou <specifikace podmnky>.


4.3.5. Pepnae linkovn

Options/Linker/Link buffer (Memory/Disk)

     Pepna uruje, zda bude pro buffer sestavovacho programu
pouita operan pam nebo disk.
     Je-li nastaven na Memory, je buffer sestavovacho programu
umstn do pamti. Linkovn je rychlej, ale pi prci s
velkmi programy hroz nebezpe nedostatku pamti (peklad se
zastav s chybou "Out of memory").
     Pi nastaven na Disk je buffer umstn na disk, pam se
tedy uvoln, sestaven programu je vak pomalej.
     Implicitn nastaven je Memory.


Options/Linker/Map file  (Off/Segments/Publics/Detailed)

     Tento pepna uruje, zda bude vytvoen .MAP soubor (tj.
soubor obsahujc urit informace o sestavovanm programu) a
kolik informac do nj bude uloeno.
     Je-li pepna nastaven na Off, nen .MAP soubor vytvoen.
Pi jinm nastaven pepnae je .MAP soubor vytvoen, je
umstn do tho adrese jako .PRG soubor, jeho jmno je a na
rozen shodn se jmnem .PRG souboru  a obsahuje:
-  pi nastaven na Segments pouze informace o segmentech (jmno
   segmetu, velikost segmentu, zatek a konec segmentu a druh
   segmentu),
-  pi nastaven na Publics informace o segmentech, jmna vech
   symbol v programu, jejich adresy a vstupn bod programu,
-  pi nastaven na Detailed informace o segmentech, jmna vech
   symbol a jejich adresy, vstupn bod programu, tabulky sel
   dk a tabulky modul.
Implicitn nastaven pepnae je Off.


4.4. Bh programu 

     Purepascalsk program lze spustit pomoc pkazu Run/Run
(Ctrl-F9) z IS nebo, pokud je vytvoen .PRG soubor obsahujc
strojov kd programu, pmo z TOSu.

4.4.1. Sputn programu z IS 

     Ke sputn programu z IS slou pkaz Run/Run (Ctrl-F9).
Je-li specifikovn parametr Compile/Primary file, pracuje pkaz
se souborem, kter je tmto parametrem uren, jinak pracuje se
souborem zavedenm do editoru. 

     Pokud byl soubor, s nm pkaz pracuje, od okamiku svho
poslednho pekladu modifikovn nebo pokud nebyl dosud peloen,
je nejprve proveden pkaz Compile/Make. Jestlie soubor
obsahuje zdrojov kd hlavnho programu, je program peloen,
sestaven a jeho strojov kd je v zvislosti na nastaven
pepnae Compile/Destination umstn bu do operan pamti
nebo do .PRG souboru na disk. Obsahuje-li soubor zdrojov kd
unity, je unita peloena, sestavena a jej strojov kd je
uloen do pslunho .PPU souboru. Jestlie v souboru nen
uloen zdrojov kd programu nebo unity, dojde k pekladov
chyb a provdn pkazu Run/Run je perueno. Po proveden
pkazu Compile/Make je peloen kd sputn. Je-li peloenm
kdem kd unity, objev se chybov hlka 

           Error ͻ
           Can't run a unit.  Press ESC. 
          ͼ

a provdn pkazu Run/Run je perueno.

     Jestlie nen teba soubor, se kterm pkaz Run/Run pracuje,
nejprve pekldat, pak
-  pokud soubor obsahuje zdrojov kd hlavnho programu, je
   tento program sputn,
-  je-li v souboru uloen zdrojov kd unity, je (stejn jako v
   pedchozm ppad) zobrazena chybov hlka a provdn
   pkazu je perueno.

     Chceme-li spoutnmu programu pedat njak parametry, je
teba ped vyvolnm pkazu Run/Run zadat tyto prametry do
vstupnho pole, kter vyvolme pkazem IS Options/Parameters.

     Vstup programu je smrovn na uivatelskou obrazovku. Obsah
uivatelsk obrazovky lze zobrazit na displeji monitoru dvma
zpsoby:
     -pomoc pkazu Run/User screen (Alt-F5),
     -pomoc okna "Output".

     Uijeme-li pkazu Run/User screen, zobraz se na celm
displeji uivatelsk obrazovka. Obrazovka IS se znovu objev po
stisknut libovoln klvesy.
     Okno "Output" umouje zobrazit vstup programu, jen je
generovn v textovm mdu, pmo na obrazovce IS (nen-li okno
"Output" na obrazovce IS zobrazeno, pouijte pkaz F6 a Alt-
F6). Pokud je okno "Output" aktivn, lze si v nm pomoc klves
pro ovldn pohybu kurzoru (klvesy se ipkami, PgDn, PgUp,
Home, End) prohldnout obsah posledn uivatelsk obrazovky.
Okno "Output" neumouje zobrazit grafick vstup programu; pro
zobrazen vstupu generovanho v grafickm mdu pouijte pkazu
Run/User screen.

Poznmka: Je-li pepna Debug/Display swapping nastaven na
None, pepisuje vstup programu obrazovku IS. Obrazovku IS lze
obnovit pomoc pkazu Debug/Refresh display.


4.4.2. Sputn programu z DOSu

     Chceme-li turbopascalsk program spoutt pmo z operanho 
systmu, je teba vytvoit jeho .PRG soubor, kter obsahuje
strojov kd programu a je spustiteln z DOSu, to znamen,
peloit program s pepnaem Compile/Destination nastavenm na
Disk. Vytvoen .PRG soubor je umstn do adrese
specifikovanho ped pekladem programu parametrem
Options/Directories/PRG & PPU directory  nebo, pokud nebyl tento
parametr specifikovn, do aktulnho adrese.
     Pedpokldejme, e jsme tmto zpsobem peloili program,
jeho zdrojov kd je uloen nap. v souboru PROG.PAS. Byl tedy
vytvoen soubor PROG.PRG a pedpokldejme, e byl umstn do
adrese \ADR. Program pak lze spustit z DOSu zcela pirozenm
zpsobem:

     \ADR\PROG [ppadn seznam parametr programu PROG]





4.4.3. Nalezen bhov chyby

     Popime si, jak najdeme v programu msto, na nm dolo k
bhov chyb. Pro ilustraci pouijme nsledujc pklad:

program PROG;
var i: integer;
begin
for i:= 10 downto 0 do
   writeln(i:20,1/i:20:2);
end.

     Pi provdn programu PROG dojde pi poslednm prchodu  
"for"-cyklem, kdy se pokusme dlit nulou (i=0), k bhov chyb.
Program se zastav a na uivatelsk obrazovce je zobrazena
zprva o bhov chyb obsahujc slo chyby a adresu strojovho
kdu, na n k chyb dolo:

                  10                0.10
                   9                0.11
                   8                0.13
                   7                0.14
                   6                0.17
                   5                0.20
                   4                0.25
                   3                0.33
                   2                0.50
                   1                1.00
                   0Runtime error 200 at 1DEA:0053.

(Adresa je na PC zapsna hexadecimln ve tvaru <segment>:<offset>.)

     Pokud byl program sputn z IS, je zen pedno zpt IS, v
okn "Edit" je zobrazena ta st zdrojovho kdu programu,
kter obsahuje pkaz, jen chybu zpsobil (pokud je teba, je
do editoru zaveden soubor, kter tento pkaz obsahje), v prvnm
dku okna "Edit" se objev chybov hlka a na mst, na nm k
chyb dolo, je umstn kurzor:

    File    Edit    Run    Compile    Options    Deb
 Edit 
Error 200: Division by zero
program PROG;
var i: integer;
begin
for i:= 10 downto 0 do
_  writeln(i:20,1/i:20:2);
end.


Po stisknut libovoln klvesy chybov hlka zmiz a je
aktivovn editor. 
     Do t doby, ne do editoru zavedeme jin soubor, lze pro
optovn nalezen msta, na nm k chyb dolo, pout pkaz
Ctrl-QW editoru, kter znovu zobraz chybovou hlku a umst
kurzor na msto s chybou. 
     Zavedeme-li do editoru bhem zjiovn piny bhov chyby 
jin soubor, lze msto s chybou znovu rychle nalzt pomoc
pkazu IS Compile/Find error. Po vyvoln tohoto pkazu se na
orazovce objev vstupn pole, v nm je uvedena adresa, na kter
dolo po sputn programu z IS k posledn bhov chyb. V naem
ppad bude obrazovka IS vypadat takto:

  File    Edit    Run    Compile    Options    Debug    Brea
Ŀ
      Line 5     Col 1    Compile  Alt-F9                 
program PROG;             Make         F9                 
var i: integer;           Build                           
begin                     Destination      Disk           
for i:= 10 downto 0 do    Find error                      
   writeln(i:20,1/i:20:2)  Error Address Ŀ             
end.                       1DEA:0053                    
                         


Stiskneme-li klvesu Enter, je msto s chybou opt nalezeno:

    File    Edit    Run    Compile    Options
 Edit 
 Target address found
program PROG;
var i: integer;
begin
for i:= 10 downto 0 do
_  writeln(i:20,1/i:20:2);
end.


     Pokud byl program sputn z operanho systmu, zavedeme do
pamti potae integrovan systm, nastavme pepna
Compile/Destination na Disk a pro nalezen msta s bhovou
chybou pouijeme pkaz Compile/Find error. Do vstupnho pole
pkazu zadme adresu, na kter dolo k bhov chyb, na zklad
zprvy o chyb zobrazen na uivatelsk obrazovce. Adresu
zadvme do vstupnho pole hexadecimln ve tvaru
<segment>:<offset>. 

Poznmka: Pkaz Compile/Find error najde msto, na nm dolo
pi provdn programu k bhov chyb pouze v ppad, e byly
pro tento program vygenerovny tabulky sel dek, tj. v
ppad, e byl program peloen s pepnai Debug/Integrated
debugging a Option/Compiler/Debug information  nastavenmi na
On.


4.5. Ladn programu

     V tomto odstavci si povme o tom, jak prostedky poskytuje
Pure Pascal pro ladn program.

4.5.1. Debugger IS 

     Debugger IS je uren pro ladn turbopascalskch program.
Umouje provdt programy po stech a po proveden kad sti
programu sledovat a modifikovat hodnoty promnnch, vyhodnocovat
rzn vrazy, sledovat voln procedur a funkc, editovat
soubory atd. V kostce eeno, pi kadm zastaven programu
umouje debugger nastavit libovoln pepna i parametr IS a
vyvolat libovoln pkaz IS krom pkazu File/OS shell, pro
kter nen bhem ladn program dost msta v pamti.

     Chceme-li pout pro ladn programu debugger IS, je teba
instruovat kompiltor, aby pi pekladu tohoto programu
vygeneroval informace, kter debugger pro svou prci potebuje,
tj. tabulky sel dek, poppad tabulky loklnch symbol.

     Nutnou podmnkou pro pouit debuggeru pro dan program je
existence tabulek sel dek. Tabulky sel dek jsou pro
program vygenerovny, pokud byl peloen s pepnaem D
(Options/Compiler/Debug information) nastavenm na On nebo s
direktivou {$D+}. Na zklad tchto tabulek me debugger
provdt program po pkazech, nastavovat v nm breakpointy a
nalzt v programu  pomoc pkazu Compile/Find error msto, na
kterm dolo k bhov chyb.

     Tabulky loklnch symbol jsou pro program vygenerovny,
pokud byl peloen s pepnaem L (Options/Compiler/Local
symbols) nastavenm na On nebo s direktivou {$L+}. Tabulky
loklnch symbol umouj pi ladn programu sledovat a
modifikovat hodnoty loklnch promnnch procedur a funkc a
voln procedur a funkc sledovat pomoc pkazu Debug/Call
stack. Jestlie nebyly tabulky loklnch symbol pro dan
program vytvoeny, lze program ladit, ale lokln promnn
procedur a funkc nejsou pro debugger dostupn.

     Pokud program pouv unity, kter chceme tak ladit, je
teba i tyto unity peloit se zapnutm pepnaem D, poppad
L. Pokud jsou tyto pepnae pi pekladu unity vypnuty, et
se sice msto na disku (je vytvoen men .PPU soubor), ale pi
ladn programu, kter unitu pouv, nelze procedury a funkce
dan unity trasovat a nejsou dostupn lokln symboly tto
unity.

Poznmka: Implicitn jsou pepnae D a L nastaveny na On.

     Vlastn zapnut debuggeru IS se provd pomoc pepnae
Debug/Integrated debugging. Je-li tento pepna nastaven na On,
je debugger IS automaticky aktivovn pi kadm sputn
programu, tj. pi kadm vyvoln pkazu Run/Run, Run/Trace
into, Run/Step over  nebo  Run/Go to cursor.  Vechny tyto
pkazy pracuj s programem, jeho zdrojov kd je uloen v
souboru, kter je uren parametrem Compile/Primary file nebo,
pokud parametr Compile/Primary file nen specifikovn, s
programem, jeho zdrojov kd je zaveden do editoru.

     Debugger IS umouje uivateli pi ladn programu pouvat
nsledujc techniky:

-  Provdn programu po pkazech, tj. trasovn resp.
   krokovn programu (pkazy Run/Trace into  a Run/Step over).
   Debugger provede vdy jeden pkaz programu, pot vpoet
   programu zastav a ek na dal instrukci.
-  Provdn programu po stech urench tzv. aktuln dkou
   programu a pozic kurzoru (pkaz Run/Go to cursor). Debugger
   provede urenou st programu, zastav vpoet a ek na
   dal instrukci.
-  Provdn programu po stech urench breakpointy. Debugger
   umouje nastavit na libovoln dce programu tzv. breakpoint
   (pkaz Break/Watch/Toggle breakpoint), kter zpsob
   zastaven vpotu programu na tto dce. Pot debugger ek
   na dal instrukci.

Poznmka: Provdn programu je mon kdykoliv peruit
stisknutm klves Ctrl-Break.

     Pi kadm zastaven programu bhem jeho ladn je mon:
-  prohldnout si vstup programu (pkaz Run/User screen nebo
   okno "Output"),
-  sledovat a modifikovat hodnoty promnnch, vyhodnocovat rzn
   vrazy (okno "Watch", pkaz Debug/Evaluate),
-  nastavit nebo zruit breakpointy (pkaz Break/Watch/Toggle
   breakpoint),
-  prohldnout si posloupnost voln podprogram, kter vedla k
   mstu, na nm byl program zastaven (pkaz Break/Watch/Call
   stack),
-  zobrazit v okn "Edit" zdrojov kd libovolnho podprogramu
   (pkaz Break/Watch/Find prodedure),
-  pokraovat v provdn programu (pkazy Run/Run, Run/Trace
   into, Run/Step over, Run/Go to cursor),
-  ukonit ladn programu (pkaz Run/Program reset),
-  program opravit, znovu ho peloit a zahjit nov ladn
   programu,
-  editovat a pekldat jin soubory, mnit hodnoty parametr a
   pepna IS, zavst do pamti jin PICK soubor nebo jin
   konfiguran soubor.

     Prbh ladn programu lze sledovat v oknech "Edit" a
"Watch". 
     V okn "Edit" je pi kadm zastaven programu zobrazena ta
st zdrojovho kdu programu, kter obsahuje pkaz, ped nm
bylo provdn programu zastaveno. dka s tmto pkazem je
barevn zvraznna a budeme ji nazvat aktuln dka programu.
Je-li to nutn, je pitom do editoru automaticky zaveden soubor,
kter st zdrojovho kdu s aktuln dkou obsahuje (tj.
soubor se zdrojovm kdem pouvan unity nebo INCLUDE soubor).
Poznamenejme, e jako aktuln nen nikdy oznaena dka, kter
neobsahuje dn vkonn pkaz, tj. przdn dka nebo dka
obsahujc pouze koment, direktivy kompiltoru, deklaraci
konstant, typ, nvt, promnnch nebo hlaviku procedury,
funkce, unity i programu.
     V okn "Watch" jsou pi kadm zastaven programu zobrazeny
aktuln hodnoty zadanch promnnch a vraz (zadvn
promnnch a vraz do okna "Watch" je popsno v odstavci
4.5.4).

     Uveden techniky ladn programu je mon libovoln
kombinovat, a to i s "obyejnm" bhem programu vyvolanm
pkazem Run/Run. Je-li vak v programu oznaena aktuln dka,
spust pkaz Run/Run vpoet programu a od aktuln dky. 
     Dojde-li pi ladn programu k bhov chyb, je samozejm
mon pi hledn msta, na nm k chyb dolo, pout pkaz
Compile/Find error. 



4.5.2. Pkazy IS pro prci s debuggerem

Trasovn a krokovn programu

Pkaz Run/Trace into (F7)

     Tento pkaz IS umouje uivatelsk program trasovat po
pkazech. Poznamenejme vak, e nejmen jednotkou programu, se
kterou me debugger IS pracovat, je obsah jedn dky
zdrojovho kdu. Je-li tedy na jedn dce zdrojovho souboru
uvedeno vce pkaz, jsou po vyvoln pkazu Run/Trace into
provedeny vechny najednou.
     Pokud je parametrem Compile/Primary file specifikovn njak
soubor, pracuje pkaz Run/Trace into  s programem, jeho
zdrojov kd je uloen v tomto souboru, jinak pracuje s
programem, jeho zdrojov kd je zaveden do editoru.
     Byl-li zdrojov kd programu od okamiku jeho poslednho
pekladu modifikovn nebo nebyl-li program dosud peloen, je
nejprve proveden pkaz Compile/Make.

     Po zahjen trasovn programu je jako aktuln oznaena
dka, kter obsahuje begin hlavnho programu. Jestlie program
pouv unity s inicializanm kdem, jsou pi dalch volnch
pkazu Run/Trace into trasovny inicializan kdy tchto unit,
jinak je zahjeno trasovn kdu hlavnho programu.
     Je-li pkaz Run/Trace into vyvoln v okamiku, kdy je jako
aktuln oznaena dka, kter obsahuje voln procedury i
funkce, je zahjeno trasovn tohoto podprogramu, pokud je jeho
zdrojov kd debuggeru dostupn.

Pi ladn programu nelze trasovat:
-  "inline", "external","interrupt" a "exit" procedury a funkce,
-  procedury a funkce standardnch unit,
-  inicializan kd a procedury a funkce unit, kter nebyly
   peloeny s pepnaem D nastavenm na On nebo jejich
   zdrojov kd nen nalezen (tj. soubor obsahujc zdrojov kd
   unity neexistuje nebo nen umstn v aktulnm adresi nebo
   v adresi urenm parametrem Options/Directories/Unit
   directories nebo jeho nzev nen shodn se jmnem unity).


Pkaz Run/Step over (F8)

     Tento pkaz je uren pro krokovn programu. Umouje
(stejn jako pkaz Run/Trace into) provdt ladn program po
pkazech, netrasuje vak kd podprogram a inicializan kd
pouitch unit. Voln procedur a funkc je zpracovno jako
jedin pkaz, stejn tak je v jednom kroku provedena
inicalizace vech pouitch unit.


Pepna  Debug/Display swapping (Smart/Always/None)

     Pi trasovn a krokovn programu lze pomoc pepnae 
Debug/Display swapping urit, ve kterch okamicch provdn
programu bude automaticky zobrazena uivatelsk obrazovka. 
     Implicitnm nastavenm pepnae je Smart. Pi tomto
nastaven je uivatelsk obrazovka zobrazena, kdykoli program
nco  zapisuje do standardnho vstupnho souboru nebo ek na
vstup a kdykoli je proveden prvn pkaz volan procedury i
funkce nebo prvn pkaz inicializan sti uvan unity.
     Je-li pepna nastaven na Always, je uivatelsk obrazovka
zobrazena pi proveden kadho pkazu.
     Je-li pepna nastaven na None, nen uivatelsk obrazovka
pi provdn programu zobrazovna vbec. Pokud program generuje
njak vstup, je pepisovna obrazovka IS. Obrazovku IS lze
obnovit pomoc pkazu Debug/Refresh display.


Pkaz Go to cursor (F4)

     Pkaz zpsob proveden sti programu, jej zdrojov kd
zan na aktuln dce a kon poslednm pkazem uvedenm
ped dkou obsahujc kurzor. Pokud nen dn dka programu
oznaena jako aktuln, je program sputn od zatku. 
     Jsou-li  v seku mezi aktuln dkou (resp. zatkem
programu) a dkou obsahujc kurzor nastaveny breakpointy,
zastav se vpoet programu ji ped dkou s prvnm
breakpointem. 

     Aby byl pkaz Run/Go to cursor proveden, mus bt kurzor 
umstn v pkazov sti programu, unity, procedury nebo
funkce. Je-li kurzor umstn v seku deklarac konstant, typ,
nvt i promnnch, dle na dce obsahujc hlaviku
procedury, funkce, unity i programu nebo na przdn i
komentov dce, kter nen umstna v pkazov sti
programu, unity, procedury i funkce, debugger pkaz ignoruje a
zobraz chybovou hlku

       Error ͻ
       No code generated for this line.  Press ESC. 
      ͼ

     Jestlie je kurzor umstn na dce v pkazov sti
programu, unity, procedury i funkce, kter neme bt provedena
(nap. na dce, kter ji byla provedena a nen soust
njakho cyklu, nebo na dce, kter obsahuje njak pkaz
"else" vtve "if-then-else" pkazu a pitom je splnna podmnka
tohoto "if-then-else" pkazu), je msto pkazu Run/Go to
cursor vyvoln pkaz Run/Run.


Prce s breakpointy

     Breakpoint je debuggerem oznaen msto v programu, na nm
vdy debugger vpoet programu zastav a ek na dal
instrukce. 
     K nastaven a ruen breakpoint v ladnm programu slou
pkaz IS  Break/Watch/Toggle breakpoint (Ctrl-F8). Po vyvoln
tohoto pkazu je na dce, na n je ve zdrojovm souboru
umstn kurzor, bu nastaven breakpoint, pokud na n jet
nastaven nen, nebo breakpoint zruen, pokud na n ji nastaven
je. dka, na kter je nastaven breakpoint, je oznaena barevnm
pruhem a mla by obsahovat aspo jeden vkonn pkaz. V
programu lze nastavit maximln 21 breakpoint.
     Vechny nastaven breakpointy lze souasn zruit pomoc
pkazu Break/Watch/Clear all breakpoints.
     Pro rychl hledn breakpoint v programu je uren pkaz
Break/Watch/View next breakpoint. Po vyvoln tohoto pkazu je
kurzor pesunut na nejbli nsledujc dek, na nm je
nastaven breakpoint (je-li teba, je do editoru zaveden soubor,
kter tento dek obsahuje). Pokud je kurzor v programu umstn
za poslednm nastavenm breakpointem, je po vyvoln tohoto
pkazu pesunut na prvn dku, na n je v programu breakpoint
nastaven.


4.5.3. Ukonen ladn a reinicializace ladcho systmu

     Pi prci s debuggerem IS je cel dostupn operan pam
vyhrazena pro ladn programu. Do pamti je zaveden debugger IS,
editor, kompiltor, aktuln zdrojov soubor, strojov kd
ladnho programu, dle jsou v pamti udrovny tabulky symbol,
tabulky sel dek, informace o nastavench breakpointech a o
vrazech zadanch do okna "Watch".
     Bhem ladn programu nen proto mon volat pkaz File/OS
shell, kter zavd znovu do pamti operan systm.

     K uvolnn operan pamti pouvan pi ladn programu
slou pkaz Run/Program reset (Ctrl-F2). Po vyvoln tohoto
pkazu je ukoneno ladn programu a dojde k reinicializaci
ladcho systmu. Souasn jsou uzaveny vechny soubory, kter
program otevel, je vyitn zsobnk od voln podprogram a
uvolnn alokovan prostor HEAPu. Nejsou reinicializovny nebo
modifikovny dn promnn (Pure Pascal nikdy automaticky
neinicializuje promnn). Typovan konstanty jsou nastaveny na
pvodn hodnoty. Pokud je po proveden pkazu Run/Program
reset vyvoln nkter z pkaz Run/Trace into, Run/Step over
nebo  Run/Go to cursor, je vpoet programu zahjen na prvn
pkazov dce hlavnho programu a cel ladn programu zan
znovu.
     Pkaz Run/Program reset je dobr pout, pokud chceme
zahjit nov ladn programu, zat ladit jin program nebo
ladn program ukonit vbec. 
Upozornn: Pkaz nezru nastaven breakpointy a vrazy zadan
do okna "Watch". Proto dve, ne zahjte ladn jinho
programu, provete pkazy  Break/Watch/Clear all breakpoints  a
Break/Watch/Remove all watches.

     Debugger IS nabdne proveden pkazu Run/Program reset tak
v ppad, e byl v prbhu ladn programu jeho zdrojov kd
modifikovn. Je-li po zsahu do zdrojovho kdu ladnho
programu vyvoln nkter z pkaz  Run/Trace into, Run/Step
over, Run/Go to cursor, Run/Run, objev se upozornn s dotazem,
zda nem bt zdrojov kd programu znovu peloen:

              Verify ͻ
              Source modified, rebuild? (Y/N) 
             ͼ

  Stiskneme-li klvesu Y, je ladn program znovu peloen a
sestaven, je vyvoln pkaz Run/Program reset a ladn programu
zane od zatku. 
  Pokud stiskneme klvesu N, debugger v ladn programu
pokrauje. Zmny, kter byly uinny ve zdrojovm kdu programu,
nemaj samozejm na provdn programu vliv, nebo strojov kd
programu byl vytvoen ped provedenm tchto zmn. Me se tedy
stt, e zobrazen aktuln dka programu nesouhlas se
skutenou aktuln dkou a e oznaen dek, na nich by mly
bt nastaveny breakpointy, neodpovd skutenmu umstnm
breakpoint v ladnm programu.


4.5.4. Sledovn hodnot promnnch a vraz 

  Ke sledovn hodnot promnnch a vraz pi ladn programu
slou okno "Watch" a pkaz Debug/Evaluate, kterho lze navc
pout ke zmn hodnot promnnch v programu. O pkazu
Debug/Evaluate si povme v odstavci 4.5.5, nyn se vnujme prci
s oknem "Watch".

Zadvn vraz do okna "Watch"

  Promnn a vrazy (dle budeme kat pouze vrazy, nebo
promnn je trivilnm vrazem), jejich hodnoty chceme
sledovat, lze do okna "Watch" zadat dvma zpsoby:

- pomoc pkazu Break/Watch/Add watch (Ctrl-F7),
- pokud je okno "Watch" aktivn, pak tak pomoc funkn klvesy
  Ins.

V obou ppadech umon IS zadat vraz do vstupnho pole

          Add Watch Ŀ
                                            
         

Zadan vraz se objev na novm dku v okn "Watch". Za vrazem
je uvedena dvojteka a 
- jeho hodnota, pokud me debugger v danm okamiku vraz
  vyhodnotit,
- zprva "Unknown identifier" oznamujc, e vraz nen v danm
  okamiku pro debugger dosaiteln,
- chybov hlka, pokud vraz nen sprvn vytvoen.

Pklad:

 File   Edit   Run   Compile   Options   Debug   Break/watch
 Edit ͸
 Line 11  Col 1 Insert Indent       Unindent C:PRIKLAD.PAS 
program PRIKLAD;                                           
var zaznam: record  x,y: real;                             
                    vztah: (VETSI,ROVNO,MENSI) end;        
    pole: array [1..3,1..2] of integer;                    
    i,j: integer;                                          
begin                                                      
with zaznam do begin                                       
   x:= PI; y:=1/x; vztah:= VETSI end;                      
for i:= 1 to 3 do                                          
   for j:= 1 to 2 do pole[i,j]:= i*100 + j;                
end.                                                       
 Watch Ĵ
 2*i+20: 26                                                
 k: Unknown identifier                                     
 zaznam: (3.1415926536,0.31830985868,VETSI)                
 pole: ((101,102),(201,202),(301,302))                     
 2*i+: Error in expression                                 


  V okn "Watch" je vdy oznaen jeden  tzv. aktuln vraz. Je-
li okno "Watch" aktivn, je aktuln vraz  zobrazen jinou
barvou, nen-li okno "Watch" aktivn, je ped aktulnm vrazem
zobrazen znak "vyplnn koleko" (ASCII kd 07) . Aktuln vraz
je mon editovat nebo z okna vypustit (viz dle). Zadme-li do
okna "Watch" nov vraz, je tento vraz vloen na dek ped
dosud aktuln vraz a je oznaen jako aktuln.

  Je-li na obrazovce IS zobrazeno okno "Watch" souasn s oknem
"Edit" (tj. pepna Options/Environment/Zoom windows je
nastaven na Off), okno "Watch" se automaticky zvtuje a
zmenuje podle toho, kolik vraz obsahuje. Maximln velikost
okna "Watch" je imlicitn 8 dk. Lze ji vak zmnit pomoc
pkazu Resize window programu TINST (viz 4.7.1).
  Jestlie je okno "Watch" aktivn, lze vrazy, kter byly do
okna zadny a nejsou v danm okamiku v okn zobrazeny,
vyrolovat pomoc klves  ipka nahoru, ipka dol, PgUp a PgDn.
Pokud je nkter vraz del ne ka okna, lze ho, je-li
oznaen jako aktuln, rolovat do stran pomoc klves ipka
vpravo, ipka vlevo, Home a End.


Do okna "Watch" lze zadat nsledujc vrazy:
- literly, konstanty a promnn peddefinovanch typ, tj.typ
  boolean, char, string, integer, longint, shortint, byte,
  word, real (vetn typ single, double, extended, comp), a
  vtovch typ,
- promnn vech typ definovanch uivatelem,
- poloky datovch struktur,
- libovoln celoseln a reln vraz obsahujc konstanty,
  promnn a poloky datovch struktur kompatibilnch typ,
- libovoln znakov vraz obsahujc v apostrofech libovoln
  tisknuteln znak, celoseln vraz petypovan na znak pomoc
  funkce Chr nebo Char(), ASCII konstanty (tj. sla z intervalu
  0 .. 255 s prefixem #),
- libovoln boolovsk vraz obsahujc boolovsk promnn a
  konstanty True a False,
- libovoln pointer a voln funkce Ptr,
- libovoln vraz typu string obsahujc stringov promnn a
  konstanty spojen opertorem +,
- libovoln mnoinov vraz vytvoen pomoc mnoinovch
  opertor + , - , * ,
- identifiktor uivatelem deklarovan procedury, funkce nebo
  metody objektu (v okn "Watch" bude zobrazena adresa jejho
  kdu v pamti).
V uvedench vrazech lze korektn pout:
- petypovn (podle pravidel uvedench v 6.2),
- vechny opertory Pure Pascalu  vetn Xor, @ atd.,
- peddefinovan funkce Abs, Addr, Chr, Hi, IOResult, Length,
  Lo, MaxAvail, Mem, MemAvail, MemL, MemW, Ofs, Ord, Pred, Ptr,
  Round, Seg, SizeOf, SPtr, SSeg, Succ, Swap, Trunc.


Zobrazen hodnot vraz jednotlivch typ

Hodnoty vraz typu integer jsou v okn "Watch" zobrazeny v
destkovm tvaru, nap.  
    -3456          0          54

Hodnoty vraz relnch typ se zobrazuj, pokud je to mon, v
desetinnm tvaru (tj. bez exponentu). Pklad:

   98769876.55      0.0000567        4.237E22

Hodnoty vraz typu character: Tisknuteln znaky se zobrazuj v
apostrofech, dc znaky (0..31 ASCII) jsou zobrazeny jako
ASCII kdy s prefixem #. Pklad:

   'm'       '8'        #4

Hodnoty boolovskch vraz jsou zobrazeny jako True a False.

Hodnoty vraz vtovch typ jsou zobrazeny pomoc pslunch
identifiktor, velkmi psmeny, nap.

   PONDELI        MODRA

Hodnoty vraz typu pointer jsou zobrazeny hexadecimln ve
tvaru PTR(<segment>,<offset>) , nap.

   PTR($3017,$111)     PTR(DSEG,$AB)     PTR(CSEG,$220)

Hodnoty vraz typu string jsou zobrazeny jako etzec v
apostrofech, nap.

   'Znakovy retezec'

Hodnoty vraz typu set: Jsou zobrazeny prvky mnoiny v
hranatch zvorkch; jednotliv prvky jsou oddleny rkami a
je-li to mon, je pi zpisu prvk pouito intervalu, nap.

   [CERVENA,MODRA,BILA]      ['A'..'Z', '0'..'9']


Zobrazen promnnch strukturovanch typ

Zpsob zobrazen promnnch typ mnoina (set) byl prv popsn.

Zobrazen promnnch typ pole (array): Jsou zobrazeny hodnoty
jednotlivch prvk pole v kulatch zvorkch, hodnoty prvk 
jsou oddleny rkami, nap.

   (-56,77,29,0,123,6)
   ( (1,2),(10,20),(100,200) )

Zobrazen promnnch typ zznam (record): Jsou zobrazeny
hodnoty jednotlivch poloek zznamu v kulatch zvorkch,
hodnoty poloek jsou oddleny rkami, nap.

   (280162,0,MUZ,True,'Karel','NOVY')
   (PONDELI,5.89,(1000,False),0)

Zobrazen promnnch typ objekt (object): Jsou zobrazeny
poloky datov sti objektu stejnm zpsobem, jako kdyby lo o
poloky zznamu.

Zobrazen promnnch typ soubor (file): Je zobrazen aktuln
stav souboru ve tvaru (<stav>,<jmno>) , kde <jmno> je jmno
fyzickho souboru na disku, kter byl dan promnn typu soubor
piazen, a

  <stav>::=  CLOSED | OPEN | INPUT | OUPPUT .

Pklad:       (INPUT,'VSTUP.TXT') .


Specifiktory formtu

  Pi zadvn vraz do okna "Watch" lze u kadho vrazu
uvst tzv. specifiktory formtu. Specifiktory formtu d
zpsob zobrazen hodnot vraz v okn "Watch". 
  Jednotliv specifiktory formtu se uvdj bezprostedn za
vrazy a od vraz se oddluj rkou. Kad specifiktor
formtu je tvoen nepovinnm opakovacm faktorem nsledovanm
posloupnost formtovacch symbol, kter me bt i przdn.
Syntaxe specifiktor formtu je tedy nsledujc:

  <specifiktor formtu>::= 
    [<opakovac faktor>] [<formtovac symbol>...],

kde
   [<opakovac faktor>]::= <kladn cel slo>,
   [<formtovac symbol>]::=  C | D | H | $ | X | F<n> |
                            M | P | R | S ,
       <n>::= <cel slo z intervalu 2..18>.


Opakovac faktor se pouv pro zobrazen uritho potu
promnnch tho typu, kter jsou v pamti umstny tsn za
sebou, napklad pro zobrazen nkolika prvk pole.
Pedpokldejme, e Seznam je promnn typu pole, jej obsah je
nsledujc:

   Seznam(11,22,33,44,55,66,77,88,99,0).

Chceme-li zobrazit pouze st pole Seznam, zadme do okna
"Watch" prvn prvek pole, kter m bt zobrazen, a opakovac
faktor, kterm urme poet zobrazovanch prvk pole, nap.
Seznam[4],3; v okn "Watch" pak bude zobrazen dek

   Seznam[4],3: 44,55,66

Nyn obecn: Vraz tvaru  <vraz>,<opakovac faktor>  zadan do
okna "Watch" m nsledujc inek:
- oznauje-li <vraz> promnnou, je v okn "Watch" zobrazen
  obsah celkem <opakovac faktor> promnnch tho typu, jakho
  je promnn <vraz>, uloench v pamti od adresy promnn
  <vraz> dle,
- jestlie <vraz> neoznauje promnnou, je opakovac faktor
  ignorovn a je zobrazena hodnota vrazu <vraz>.


Formtovac symboly a jejich vznam:

C  "Character". Uruje zpsob zobrazen dcch znak (ASCII
   0..31). Implicitn jsou dc znaky zobrazovny jako ASCII
   kdy s prefixem #, pouijeme-li formtovacho symbolu C, jsou
   dc znaky zobrazeny jako speciln zobraziteln znaky (viz
   ASCII tabulka). Tk se znak a etzc.

D  "Decimal". Vechny celoseln hodnoty jsou zobrazeny v
   destkovm tvaru. Tk se celoselnch vraz a datovch
   struktur (array, record, object, set) obsahujcch
   celoseln poloky.

H  "Hexadecimal". Vechny celoseln hodnoty jsou zobrazeny v
   hexadecimlnm tvaru s prefixem $. Tk se celoselnch
   vraz a datovch struktur (array, record, object, set)
   obsahujcch celoseln poloky.

$  "Hexadecimal". M stejn inek jako symbol H.

X  "Hexadecimal". M stejn inek jako symbol H.

S  "String". Zobraz dc znaky jako ASCII kdy s prefixem #.
   M vznam, jen je-li uit souasn s formtovacm symbolem M.

M  "Memory". Zobraz vpis pamti pro danou promnnou. 
   Implicitn je kad byte promnn zobrazen jako dv
   hexadecimln slice. Pipojme-li formtovac symbol D,
   jsou jednotliv byty zobrazeny v destkovm tvaru, pokud
   pipojme symbol H, $ nebo X, jsou byty zobrazeny v
   hexadecimlnm tvaru s prefixem $. Formtovac symbol C nebo
   S zpsob, e promnn je zobrazena jako etzec. 
   Pro uren potu zobrazovanch byt lze pout opakovacho
   faktoru (implicitn poet zobrazench byt odpovd velikosti
   promnn).
   Vraz, u nho je uveden formtovac symbol M, mus bt
   konstrukt, kter se me objevit na lev stran piazovacho
   pkazu, tj. konstrukt, kter oznauje adresu v pamti,
   jinak je symbol M ignorovn. Pklad:

 File   Edit   Run   Compile   Options   Debug   Break/watch  
 Edit ͸
 Line 1   Col 1 Insert Indent       Unindent C:PRIKLAD.PAS   
program PROG;                                                
var slovo: string;                                           
begin                                                        
slovo:= 'ABCD abcd';                                         
end.                                                         
                                                             
 Watch Ĵ
 slovo: 'ABCD abcd'                                          
 length(slovo): 9                                            
 slovo[0],10: #9,'A','B','C','D',' ','a','b','c','d'         
 slovo[0],10MeSs: #9'ABCD abcd'                                
 slovo[0],10MD: 9 65 66 67 68 32 97 98 99 100                
 slovo[0],10MH: $9 $41 $42 $43 $44 $20 $61 $62 $63 $64       
 slovo[0],10M: 09 41 42 43 44 20 61 62 63 64                 


F<n> "Floating-point". Uv se pro zobrazen hodnot v pohybliv
     dov rce. <n> specifikuje poet signifikantnch slic,
     kter budou zobrazeny. <n> me bt z intervalu 2..18, jeho
     implicitn hodnota je 11. Tk se relnch vraz a
     datovch struktur (array, record, object) obsahujcch
     reln poloky.

R  "Record". Pi zobrazen hodnot poloek zznamu a datovch
   poloek objektu zobraz i jmna tchto poloek. Tk se
   promnnch typ record a object. Pklad:

 File   Edit   Run   Compile   Options   Debug   Break/watch
 Edit ͸
 Line 11  Col 1 Insert Indent       Unindent C:PRIKLAD.PAS  
 program Priklad;                                           
 var zaznam: record                                         
             x,y: real;                                     
             a: array [1..3] of integer;                    
             b: boolean;                                    
             end;                                           
     i,j: integer;                                          
 begin                                                      
 i:= 2349;                                                  
 with zaznam do                                             
    begin                                                   
    x:= PI; y:=1/x; b:= (x > y)                             
    for j:= 1 to 3 do a[j]:= j*10 + j;                      
    end;                                                    
 end.                                                       
 Watch Ĵ
 j: 2349                                                    
 j,H: $92D                                                   
 zaznam,F5: (3.1416,0.31831,(11,22,33),TRUE)                 
 zaznam,RF2: (X:3.1;Y:0.32;A:(11,22,33);B:TRUE)              
 


P  "Pointer". Zobraz pointery ve tvaru <segment>:<offset>
   msto v implicitnm tvaru  PTR(<segment>,<offset>). Tk se
   jen promnnch typu pointer. Pklad:

 File   Edit   Run   Compile   Options   Debug   Break/watch  
 Edit ͸
 Line 11  Col 1 Insert Indent       Unindent C:PRIKLAD.PAS  
 program Priklad;                                           
 type ukazatel = ^zaznam;                                   
      zaznam = record                                       
                  jmeno: string;                            
                  info: integer;                            
                  dalsi: ukazatel;                          
               end;                                         
 var U: ukazatel;                                           
 procedure inic (U:ukazatel;JM:string; INF:integer);        
    begin with U^ do                                        
       begin dalsi:= nil; jmeno:= JM; info:= INF end;       
    end;                                                    
 begin                                                      
 new(U); inic(U,'Prvni',111);                               
 end.                                                       
 Watch Ĵ
 U: PTR($5D53,$0)                                           
 U,P: 5D53:0000                                             
 U^,R: (JMENO:'Prvni';INFO:111;DALSI:NIL)                   
 inic: PTR(CSEG,$8)                                         
 


Dostupnost identifiktor

  Oblast dostupnosti kadho identifiktoru je omezena
pkazovou st programu, unity, procedury i funkce, pro
kterou je dan identifiktor deklarovn. Pitom plat, e
identifiktory deklarovan na ni rovni zastiuj shodn
identifiktory na rovni vy. To znamen, e je-li napklad v
programu deklarovna globln promnn I a v nkter procedue
i funkci programu je deklarovna lokln promnn I, nen v
okamiku vpotu tto procedury i funkce globln promnn I
dostupn.

  Je-li vraz zadan do okna "Watch" loklnm identifiktorem
procedury, funkce nebo unity, nen v okamiku provdn tto
procedury, funkce nebo inicializan sti unity dostupn
identifiktor tho jmna deklarovan v bloku, z nho byla dan
procedura, funkce i inicializace unity volna. 
  Dojde-li tedy pi provdn programu ke shod identifiktor
deklarovanch na rznch rovnch, e se tato kolize podle
pravidla: "Bli koile ne kabt" a v okn "Watch" je vdy
zobrazena "koile". Nabz se otzka, zda je mon v okn
sledovat i ppadn "svetry" a "kabt". Ano je - pomoc
kvalifikace identifiktor.

  Kvalifikovan identifiktor je zpis tvaru

   <id.programu>[.<id.podprogramu>. ...].<identifiktor>
resp.
   <id.unity>[.<id.podprogramu>. ...].<identifiktor> .

Pklad:
- kvalifikovan identifiktor PROGR.PROC1.FNC.PROC2.I oznauje
  lokln identifiktor I procedury PROC2 deklarovan ve funkci
  FNC, kter je deklarovna v procedue PROC1 deklarovan v
  programu PROGR.
- kvalifikovan identifiktor UNITA.PROC.J oznauje lokln
  identifiktor J procedury PROC, kter je deklarovan v seku
  "implementation" unity UNITA.

Dal pklad:

program PROGR;                 unit UNITA;
uses UNITA;                    interface
var X: real;                      X: array [1..5] of integer;
procedure PROC;                implementation
  var X: string;              begin ... end.
  begin ... end;
begin ... end.

Do okna "Watch" lze zadat nsledujc vrazy:
  PROGR.X
  UNITA.X
  PROGR.PROC.X
  X
  @X = @PROGR.X     ... je-li hodnota tohoto vrazu TRUE,
                        oznauje identifiktor X globln
                        promnnou X hlavnho programu
  atd.


Editace vraz v okn "Watch"

  Vrazy zadan do okna "Watch" lze editovat pomoc pkazu IS 
Break/Watch/Edit watch  nebo, je-li okno "Watch" aktivn, pomoc
funkn klvesy Enter. V obou ppadech se objev vstupn pole,
v nm je zobrazen etzec, kter je shodn s aktulnm vrazem,
nap.

           Edit Watch Ŀ
           a+b-c/d                           
          

Tento etzec meme obvyklm zpsobem editovat (pipomeme si,
e pokud se nm poda omylem editovan etzec zniit, lze
pvodn obsah vstupnho pole obnovit pomoc Ctrl-R). Stiskneme-
li bhem editace klvesu Enter, je aktuln vraz v okn "Watch"
nahrazen etzcem odeslanm ze vstupnho pole; jestlie
stiskneme klvesu Esc, je editace etzce ukonena, ani by byla
provedena prava aktulnho vrazu v okn "Watch".


Vyputn vrazu z okna "Watch"

  Vraz, kter je oznaen jako aktuln, lze z okna "Watch"
vypustit pomoc pkazu IS Break/Watch/Delete watch nebo, je-li
okno "Watch" aktivn, pomoc funkn klvesy  Del a pkaz
Ctrl-Y a Ctrl-G.
  K vymazn vech vraz z okna "Watch" slou pkaz IS
Break/Watch/Remove all watches.


4.5.5. Modifikace hodnot promnnch 

  Debugger IS umouje bhem ladn programu mnit hodnoty
promnnch a sledovat, jak na takov zmny program reaguje.
Modifikaci hodnot promnnch lze provdt pomoc pkazu IS
Debug/Evaluate (Ctrl-F4). 
  Po vyvoln tohoto pkazu se objev okno, kter m ti pole:
"Evaluate", "Result", "New value".

Ŀ
  Evaluate Ŀ 
  j,H                                               
  
  Result Ŀ 
  $92D                                              
  
  New value Ŀ 
                                                    
  


Pole "Evaluate" obsahuje aktuln vraz okna "Watch". Tento
vraz je mono editovat (stejn jako vraz v poli, kter je
vyvolno pkazem Break/Watch/Add watch  resp. Edit watch).
Pokud dosud nebyl do okna "Watch" zadn dn vraz, je pole
"Evaluate" przdn a lze do nj zapsat jakkoliv vraz, kter
me bt uveden v okn "Watch", vetn specifiktor formtu. Po
stisknut klvesy Enter se v poli "Result" objev hodnota vrazu
odeslanho z pole "Evaluate". Je-li tato hodnota pli dlouh,
lze pout klves ipka vlevo, ipka vpravo, Home a End k
rolovn obsahu pole.

  Je-li v poli "Evaluate" uveden vraz, kter m reprezentaci v
pamti (tj. identifiktor promnn, poloka zznamu, objektu i
pole), lze zadat do pole "New value" vraz (rozumj - konstantu,
promnnou, vraz), kter uruje novou hodnotu tto promnn i
poloky. Zadan vraz mus bt kompatibiln vzhledem k piazen
s promnnou resp. polokou, jej hodnotu mnme. Po odesln
vrazu z pole "New value" se v poli "Result" zobraz nov
hodnota promnn resp. poloky specifikovan v poli "Evaluate".

Poznmka: Mezi jednotlivmi poli se lze pohybovat pomoc klves
ipka nahoru, ipka dol.

  Pi modifikaci hodnoty promnn i poloky uveden v poli
"Evaluate" me dojt k nsledujcm chybm:

- Vraz uveden v poli "Evaluate" neme bt modifikovn, tj.
  nem reprezentaci v pamti nebo oznauje datovou strukturu
  (pole, zznam, objekt, mnoinu, soubor). Po odesln nov
  hodnoty z pole  "New value"  se v poli "Result" zobraz
  chybov hlka "Cannot be modified".
- Vraz zadan jako nov hodnota reprezentuje datovou strukturu
  (pole, zznam, objekt, mnoinu, soubor) a neme bt tud
  piazen. Zobraz se chybov hlka "Cannot evaluate this
  expression".
- Vraz zadan jako nov hodnota nen kompatibiln vzhledem k
  piazen s promnnou i polokou v poli "Evaluate". Zobraz
  se chybov hlka  "Type mismatch". 
- Nov hodnota pekrauje rozsah hodnot, jich me promnn
  resp. poloka uveden v poli "Evaluate" nabvat. Zobraz se
  chybov hlka "Constant out of range".
- Vraz uveden v poli "Evaluate" obsahuje promnnou, kter
  nen v danm okamiku v programu dostupn. Zobraz se chybov
  hlka "Unknown identifier".
Obsah pole "Result" pepsan chybovou hlkou obnovme tak, e
se pesuneme do pole "Evaluate" a stiskneme Enter.

Poznmka: Pol "Evaluate" a "Result" lze pout pi provdn
rznch pomocnch vpot jako kalkulaky. Pklad:

Ŀ
  Evaluate Ŀ 
  (1+45-8)/2                                        
  
  Result Ŀ 
  19                                                
  


4.5.6. Prostedky pro ladn procedur a funkc

  Pi voln kad procedury a funkce v programu si debugger IS
ukld do zsobnku voln podprogram potebn informace o
volan procedue i funkci vetn odkazu na msto voln tto
procedury i funkce v programu a hodnot nebo adres pedvanch
parametr. Po ukonen vpotu procedury i funkce jsou pak tyto
informace ze zsobnku vyputny. Zsobnk voln podprogram
obsahuje tedy informace o dynamickm vnoen procedur a funkc v
kadm okamiku provdn programu. Jsou v nm uloeny informace
o vech procedurch a funkcch, jejich vpoet byl bhem
provdn programu zahjen, ale nebyl dosud ukonen.
  Obsah zsobnku voln podprogram lze bhem ladn programu
sledovat pi kadm zastaven vpotu programu pomoc pkazu IS
Debug/Call stack (Ctrl-F3). Po vyvoln tohoto pkazu se objev
pole obsahujc seznam procedur a funkc, jejich vpoet nebyl
dosud ukonen, vetn jejich parametr, nap.

           Call Stack Ŀ
           PROC1(0,1,1)                        
           PROC2(2.5,0.0)                      
           PROC3                               
           PROC4('abcdefghijklmnopqrstuvwxyz') 
           PROG                                
          

(v poli je zobrazuje obsah zsobnku voln podprogram v
okamiku provdn procedury PROC1 v nsledujcm programu:
program PROG;
var slovo: string;
procedure proc1 (a,b,c:integer);
  begin ... end;
procedure proc2 (x,y: real);
  begin proc1(0,1,1) end;
procedure proc3;
  begin proc2(2.5,0) end;
procedure proc4 (var s: string);
  begin proc3 end;
begin
slovo:= 'abcdefghijklmnopqrstuvwxyz';
proc4(slovo);
end.
)

Na prvnm mst v seznamu je uvedeno jmno, poppad parametry
procedury resp. funkce, kter se prv provd, na druhm mst
je uvedeno jmno, poppad parametry procedury resp. funkce, ze
kter byla volna prvn procedura seznamu atd. Jako posledn je
v seznamu uvedeno jmno ladnho programu. Pokud ladn program
nem dn jmno, je implicitn pojmenovn jako PROGRAM. Seznam
obsahuje maximln 128 naposledy volanch procedur a funkc.
  Pomoc klves ipka nahoru, ipka dol lze oznait libovolnou
proceduru i funkci seznamu. Po stisknut klvesy Enter je v
okn "Edit" zobrazena ta st zdrojovho kdu programu, kter
obsahuje odpovdajc voln vybran procedury i funkce (je-li
teba, je pitom do editoru zaveden jin soubor). Tato operace
nem vliv na provdn programu - pokud je program znovu
sputn, jeho vpoet pokrauje na aktuln dce, i kdy nen
prv v okn "Edit" zobrazena. 
  Pkaz Debug/Call stack  se asto pouv v kombinaci s
pkazem Run/Go to cursor, pokud nechceme pi ladn programu
trasovat nkter sti kdu vyvolanch procedur a funkc.

Poznmky: 
  Jmno metody je v seznamu zobrazeno s prefixem typu objektu,
kter metodu definuje. Je-li teba je v zobrazenm seznamu
pouito kvalifikace identifiktor procedur a funkc.
  Poloka "Call stack" menu "Debug" je dostupn pouze pi ladn
program.


Nalezen deklarace procedury i funkce v programu

  Msto, na nm je v programu deklarovna njak procedura
nebo funkce lze bhem ladn programu rychle nalzt pomoc
pkazu  Debug/Find procedure. Po vyvoln tohoto pkazu se
objev vstupn pole:

       Enter procedure name Ŀ
                                                
      

Odeleme-li z tohoto pole identifiktor hledanho podprogramu,
je v okn "Edit" zobrazena ta st zdrojovho kdu programu, ve
kter je zadan podprogram deklarovn a kurzor je umstn na
prvnm vkonnm dku tohoto podprogramu. 
  Pi zadvn identifiktoru podprogramu do vstupnho pole,
lze, je-li to teba, identifiktor kvalifikovat jmnem programu
i unity, poppad jmny procedur a funkc, v nich je dan
podprogram deklarovn.
  Pkaz Debug/Find procedure nem vliv na provdn programu -
pokud je program znovu sputn, jeho vpoet pokrauje na
aktuln dce, i kdy nen prv v okn "Edit" zobrazena.
Pkaz se opt asto pouv v kombinaci s pkazem Run/Go to
cursor.

Poznmka: Poloka "Find procedure" je v menu "Debug" dostupn
a po peloen programu.


4.5.7. Pprava na ladn programu pomoc Pure Debuggeru

  Pure Debugger je samostatn debugger, kter je rovn
produktem firmy Borland International. Umouje ladit programy
napsan v jazycch Pure Pascal, Pure C  a Pure Assembler. 

  Pure debugger lze pout pro ladn velkch nebo sloitch
program, kter vyaduj hodn pamti.

  Chceme-li pro ladn turbopascalskho programu pout Pure
Debugger, je teba v IS vytvoit .PRG soubor danho programu,
kter bude obsahovat vechny informace, je Pure Debugger pro
svou prci potebuje. 
  .PRG soubor pro Pure Debugger je vytvoen, pokud je program
peloen s pepnai  Debug/Standalone debugging  a 
Compile/Destination nastavenmi na On  a s direktivami {$D+,L+}
nebo se zapnutmi pepnai kompiltoru D a L.

Poznmka: Pi nastaven pepnae Compile/Destination na Memory
je stav pepnae Debug/Standalone debugging ignorovn.


4.6. Prce s konfiguranmi soubory

4.6.1. PICK soubory

  PICK soubory slou k uloen nkterch informac tkajcch
se prce v editoru. 

PICK soubor obsahuje:
- PICK seznam, tj. seznam jmen osmi naposledy editovanch
  soubor, 
- pro kad soubor z PICK seznamu informace o posledn pozici
  kurzoru v tomto souboru, o poslednm oznaenm bloku a o
  poslednch znakch nastavench pkazem Ctrl-Qn,
- posledn parametry pkaz CtrlQF (nalezen znakovho etzce)
  a Ctrl-QA (nalezen a pepsn znakovho etzce), pokud byly
  tyto pkazy pi prci s editorem pouity; to znamen, e
  obsahuje posledn vyhledvan etzec, posledn etzec
  pouit pro pepisovn a posledn vyhledvac podmnky.

  Jestlie je definovn njak PICK soubor a pepna
Options/Environment/Config auto save je nastaven na On, jsou pi
ukonen prce v IS do tohoto PICK souboru uloeny vechny ve
uveden informace. Pi dalm vyvoln IS lze pak tento PICK
soubor zavst do pamti. Na zklad informac, kter PICK soubor
obsahuje, je obnoven PICK seznam, do editoru je zaveden prvn
soubor uveden v PICK seznamu, kurzor v tomto souboru je umstn
na urenou pozici a je-li teba je v souboru oznaen blok a
nastaveny znaky, dle jsou obnoveny parametry pkaz Ctrl-QF a
Ctrl-QA.

  Implicitnm PICK souborem IS je soubor PURE.PCK. Nov PICK
soubor lze definovat pomoc pkazu Options/Directories/Pick
file name. Po vyvoln tohoto pkazu se objev vstupn pole

       Pick File Name Ŀ
       PURE.PCK                                
      

Zadme-li do tohoto pole jmno novho PICK souboru (me bt
samozejm uveden i adres), IS ulo do stvajcho PICK
souboru potebn informace o aktulnm stavu editoru a 
- pokud nov PICK soubor existuje, zavede ho do pamti a provede
  odpovdajc zmnu stavu editoru, 
- pokud soubor, jeho jmno bylo zadno do vstupnho pole,
  neexistuje, je vytvoen a obsahuje stejn informace jako PICK
  soubor, kter byl a dosud aktuln.
Souasn je jmno novho (nyn ji aktulnho) PICK souboru
zobrazeno v menu "Options/Directories"
(Options/Directories/Current pick file).

  Pi zahjen prce s IS se IS pokou zavst do pamti PICK
soubor, jeho jmno je uloeno v implicitnm konfiguranm
souboru PURE.TP (viz nsledujc odstavec) nebo, pokud tento
konfiguran soubor neexistuje, pokou se IS zavst do pamti
implicitn PICK soubor PURE.PCK. IS hled oba tyto soubory
nejprve v aktulnm adresi, pak v adresi urenm parametrem
Options/Directories/Pure directory a pod operanmi systmy
DOS 3.x jet v adresi, z nho byl IS zaveden.

  Pi ukonen prce v IS je aktuln PICK soubor, pokud je
pepna Options/Environment/Config auto save nastaven na On,
aktualizovn a uloen na disk.

Poznmka: Implicitn jmno PICK souboru lze zmnit pomoc
programu TINST (viz 4.7.1).


28262) Konfiguran soubory

  Konfiguran soubory IS slou k ukldn informac o
nastaven parametr a pepna IS uvedench v
   menu "Options/Compiler",
   menu "Options/Environment" a
   menu "Options/Directories"
vetn informace o jmnu aktulnho PICK souboru.
Po zaveden konfiguranho souboru do pamti je na zklad
tchto informac provedeno nastaven parametr a pepna IS a
je zaveden pslun PICK soubor.

  Konfiguran soubor lze vytvoit nebo modifikovat pomoc
pkazu Options/Save options IS.

  Po vyvoln IS je do pamti potae implicitn zaveden
konfiguran soubor PURE.TP. IS hled tento soubor nejprve v
aktulnm adresi, pak v adresi, kter je specifikovn
parametrem Options/Directories/Pure directory, a pod operanmi
systmy DOS 3.x jet v adresi, z nho byl IS sputn. Pokud
nen soubor PURE.TP nalezen, objev se chybov hlka a dn
konfiguran soubor do pamti zaveden nen.
Poznmka: Implicitn jmno kofiguranho souboru lze zmnit
pomoc programu TINST (viz 4.7.1).

  Bhem prce v IS lze do pamti potae zavdt pomoc pkazu
Options/Retrieve options rzn konfiguran soubory. Po vyvoln
tohoto pkazu se objev vstupn pole, do nho lze zadat
oznaen skupiny soubor: 

       Config File Ŀ
       *.TP                                     
      

IS zobraz pole se seznamem soubor, jejich nzvy odpovdaj
zadanmu oznaen a umon uivateli vybrat si jin konfiguran
soubor. Pot je aktuln nastaven parametr a pepna IS a
jmno PICK souboru uloeno do stvajcho konfiguranho
souboru, vybran konfiguran soubor je zaveden do pamti a na
zklad jeho obsahu je zmnno nastaven parametr a pepna
IS a jmno aktulnho PICK souboru.
  Pokud je do vstupnho pole zadno jmno souboru, kter nen
souborem konfiguranm (nap. jmno zdrojovho souboru
PRIKLAD.PAS), objev se chybov hlka:

   Error ͻ
   Invalid configuration file: PRIKLAD.PAS.  Press ESC. 
  ͼ

a provdn pkazu je perueno.


4.6.3. Automatick ukldn PICK soubor a konfiguranch 
       soubor 

  Automatick ukldn PICK soubor a konfiguranch soubor na
disk lze zapnout resp. vypnout pomoc pepnae
Options/Environment/Config auto save (On/Off). 
  Je-li pepna nastaven na On, je pi kadm vyvoln
kterhokoliv z pkaz File/OS shell, File/Quit, Run/Run,
Run/Trace into, Run/Step over, Run/Go to cursor aktualizovn
obsah aktulnho PICK souboru a aktulnho konfiguranho
soubor, pokud byl zmnn od okamiku poslednho uloen na disk.
  Je-li pepna nastaven na Off, dn automatick ukldn
PICK soubor a konfiguranch soubor se neprovd. Aktuln
PICK soubor  je uloen  na disk  pouze po vyvoln pkazu
Options/Directories/Pick file name, aktuln konfiguran soubor
je uloen pouze po vyvoln pkazu Options/Save options.


4.7. HOT KEYS

  Pojem HOT KEY oznauje klvesu, jejm stisknutm (resp. dv
klvesy, jejich souasnm stisknutm) lze kdykoliv pi prci v
IS vyvolat njak pkaz IS.

  Jednotliv HOT KEY byly vdy uvedeny pi popisu pslunho
pkazu IS. Pro pehlednost je vak shrme do nsledujc
tabulky:

HOT KEY   Funkce


 F1       vyvol help Pure Pascalu
 F2       ulo soubor zaveden do editoru na disk
          (File/Save)
 F3       zavede soubor do editoru 
          (File/Load)
 F4       pokrauje v provdn programu, dokud nenaraz
          na dku, na n je kurzor 
          (Run/Go to cursor)
 F5       pepna, kter uruje poet oken na obrazovce IS
          (Options/Environment/Zoom windows)
 F6       zpsob, e se stane aktivnm jin okno 
 F7       trasovn programu - jsou trasovny i podprogramy
          (Run/Trace into)
 F8       krokovn programu - nejsou trasovny podprogramy
          (Run/Step over) 
 F9       peklad a sestaven programu pomoc Make 
          (Compile/Make)
 F10      pepn mezi menu a aktivnm oknem

 Alt-F1      zobraz pedchoz strnku helpu
 Alt-F3      umon vybrat si pi zavdn souboru do editoru
             soubor z PICK seznamu
             (File/Pick)
 Alt-F5      zobraz uivatelskou obrazovku
             (Run/User screen)
 Alt-F6      pepn obsah aktivnho okna 
             (tj. pepn mezi okny "Watch" a "Output" nebo 
              mezi dvma naposledy editovanmi soubory v okn
              "Edit")
 Alt-F9      peklad a sestaven programu pomoc Compile
             (Compile/Compile)

 Alt-B     vyvol "Break/watch" menu 
 Alt-C     vyvol "Compile" menu 
 Alt-D     vyvol "Debug" menu 
 Alt-E     vyvol editor 
 Alt-F     vyvol "File" menu 
 Alt-O     vyvol "Options" menu 
 Alt-R     vyvol "Run" menu 
 Alt-X     ukon prci v IS - nvrat do DOSu 
           (File/Quit)

Ctrl-F1     vyvol strnku helpu tkajc se vyhrazenho slova  
           nebo peddefinovanho identifiktoru oznaenho
             kurzorem
Ctrl-F2      ukon ladn programu
             (Run/Program reset)
Ctrl-F3      bhem ladn programu zobraz zsobnk voln
             procedur a funkc
             (Debug/Call stack)
Ctrl-F4      umon vyhodnotit nebo modifikovat promnnou
             (Debug/Evaluate)
Ctrl-F7      umon pidat vraz do okna "Watch"
             (Break/Watch/Add watch)
Ctrl-F8      umon nastavit nebo zruit breakpoint 
             (Break/Watch/Toggle breakpoint)
Ctrl-F9      vyvol bh programu
             (Run/Run)

Shift-F10     zobraz informace o verzi IS


4.8. Programy uiten pi prci v IS

4.8.1. TINST.PRG

  TINST je interaktivn program, kter umouje podle poadavk
uivatele nastavit implicitn hodnoty pepna a parametr IS,
velikosti oken "Edit" a "Watch"/"Output", pedefinovat pkazov
klvesy editoru a nastavit barvy a md obrazovky IS.

Sputn programu TINST

  TINST se spout z DOSu, syntax je nsledujc:

TINST [<volba>] [<adres>] [<soubor>]

  Parametry <volba>, <adres> a <soubor> jsou nepovinn a
jejich vznam je nsledujc:

<volba>  - Pokud je detekovn adaptr umoujc pracovat v
           barvch, generuje program TINST barevn obrazovky;
           chceme-li, aby TINST pracoval ernoble, uvedeme pi
           jeho spoutn parametr /B.
          Pklad: TINST /B

<adres> -  Nen-li tento parametr uveden, hled program TINST
             soubor PURE.PRG v aktulnm adresi, jinak v
             adresi specifikovanm (absolutn i relativn)
             parametrem <adres>.
           Pklad: TINST c:\tpas
                   TINST c:\..\..\adr

<soubor> - Pokud se program umoujc vyvolat IS nejmenuje
           PURE.PRG, je teba zadat jmno souboru, v nm je
           uloen.
          Pklad: TINST /B c:\TPAS\TP.PRG
                   TINST \TP\BAREVNY.PRG

  Po sputn programu TINST se objev jeho prvn obrazovka
obsahujc hlavn menu programu TINST:

                  Installation Menu 
                                    
                  Compile           
                  Options           
                  Debug             
                  Editor commands   
                  Mode for display  
                  Set colors        
                  Resize windows    
                  Quit/save         
                 

Z instalanho menu lze vybrat libovolnou poloku stejnm
zpsobem jako z menu IS. Pkazy instalanho menu maj tento
vznam:

Pikaz Compile
  Umouje specifikovat implicitn nastaven pepnae IS
Compiler/Destination a parametru IS Compiler/Primary file.

Pkaz Options
  Umouje specifikovat implicitn nastaven pepna a
parametr tchto menu IS:  
   "Options/Compiler",
   "Options/Linker",
   "Options/Environment",
   "Options/Directories ",
a parametru IS  Options/Parameters, dle pak umouje urit
implicitn nastaven pepna editoru a specifikovat nkter
poadavky na pam:

 Installation Menu 
    Options Menu Ŀ
     Environment Settings Ŀ
      Editor options Ŀ
                                     
      Insert mode              Off   
      Autoindent mode          Off   
   ĳ  Use tabs                 On    
ĳ  Optimal fill             Off   
        Backspace unindents      Off   
        Tab size                 10    
      ĳ Editor buffer size       65534 
         Make use of EMeSs memory   On    
                                        
        

- Pure Pascal rezervuje 8 KB pamti pro ukldn grafickch
  obrazovek. Pokud pracujete jen v textovm mdu, lze tuto
  pam uvolnit nastavenm pepnae  Options/Environment/Full
  graphics save  na Off.
- Pomoc pkazu Options/Environment/Options for editor/Editor
  buffer size lze nastavit velikost bufferu editoru (implicitn
  m buffer editoru 65534 B, povolen hodnoty jsou 20000 a
  65534 B).
- Pomoc pepnae Options/Environment/Options for editor/Make
  use of EMeSs memory lze urit, zda m editor pouvat pro svj
  buffer 64 KB EMeSs pamti, pokud je instalovna.

Pkaz Debug
  Umouje specifikovat implicitn nastaven pepna menu
"Debug" IS, tj. pepna:
   Debug/Integrated debugging,
   Debug/Stand-alone debugging,
   Debug/Display swapping.

Pkaz Editor commands
  Umouje pedefinovat klvesov pkazy editoru IS. Nov
definovan pkazy mohou potlait pvodn funkci funknch
klves (jako pkaz editoru nelze pout F1 a Alt-F1).

Pkaz Mode for display
  Umouje urit md zobrazovac jednotky.

Pkaz Set colors
  Umouje nastavit barvy obrazovky IS.

Pkaz Resize windows
  Umouje nastavit velikost oken "Edit" a "Watch"/"Output".

Pkaz Quit/save
  Umouje uloit proveden nastaven do souboru PURE.PRG
resp. do souboru specifikovanho parametrem <soubor>.

Podrobnj informace o programu TINST lze nalzt v "Pure
Pascal User's Guide" na str. 291 a 312.


4.8.2. PPUMOVER.PRG

  Program PPUMOVER je uren pro sprvu knihoven unit. Jeho
hlavn vyuit je pi prav obsahu knihovny PURE.TPL.

Sputn programu PPUMOVER

  PPUMOVER se spout z DOSu, syntax je nsledujc:

PPUMOVER  [[<adres1>]<soubor1>] [[<adres2>]<soubor2>]

<soubor1> a <soubor2> mus bt .TPL nebo .PPU soubory (rozen
.PPU je implicitn s vjimkou souboru se jmnem PURE, tento m
implicitn rozen .TPL). Pokud soubor <soubor1> resp.
<soubor2> nen uloen v aktulnm adresi, je teba uvst
parametr  <adres1> resp. <adres2>, kter udv adres, v
nm je soubor uloen.

  PPUMOVER zavede soubory <soubor1>, <soubor2> do pamti a
zobraz jejich obsah ve dvou oknech. Uvedete-li jen jeden
soubor, je prav okno implicitn pojmenovno NONAME.PPU. Nen-li
uveden dn soubor, PPUMOVER zobraz obsah souboru PURE.TPL;
pokud soubor PURE.TPL nenalezne, zobraz jmna soubor na disku
s rozenm .TPL.

  Po sputn programu PPUMOVER se na obrazovce objev dv okna:

 C:\TPAS\PURE.TPL ͻ  C:\TPAS\OVERLAY.PPU
 Unit     Code  Data  Syms Uses    Unit     Code  Data  Syms 
ĺ 
 SYSTEM  21659   664  4327        OVERLAY  1844    24   975 
 OVERLAY  1844    24   975                                   
 CRT      1555    20  1721                                   
 DOS      1593     6  4107                                   
 PRINTER    56   256   305                                   
                                                             
                                                             
                                                             
ͼ 

V prvn dce kadho okna je uvedeno jmno souboru, pod nm
nsleduje seznam unit uloench v tomto souboru s informacemi o
kad unit (jmno, velikost kdu, velikost dat, velikost
tabulky symbol a jmna pouvanch unit; velikosti jsou v
bytech, jmna uvanch unit jsou zkrcena na 7 znak, je-li
uvanch unit vce, je zobrazena jen prvn a nkolik teek, po
stisknut F4 se objev dal uvan unity).

  V kadm okamiku je aktivn jedno okno (m dvojit rmeek).
V aktivnm okn je barevn odlien ukazatel dky, kter lze
pemisovat pomoc klves pro pohyb kurzoru. Vechny pkazy
programu PPUMOVER se aplikuj na unity aktivnho okna.

  Pod okny je uvedena informace o velikosti souboru, jeho
obsah je zobrazen v aktivnm okn, a o volnm mst na disku
(velikosti jsou v bytech). Posledn dka obrazovky obsahuje
pehled zkladnch pkaz programu PPUMOVER.

Pkazy programu PPUMOVER:

F1 - vyvol help s informacemi o pouit programu PPUMOVER,
F2 - ulo na disk soubor, jeho obsah je zobrazen v aktivnm
     okn,
F3 - umon vbr novho souboru do aktivnho okna,
F4 - zobraz pokraovac okno, kter obsahuje unity pouvan
     unitou, je je oznaena ukazatelem,
F6 - pepn mezi okny (aktivnm se stane druh okno),
+  - ozna unitu pro koprovn i mazn (lze oznait vce
     unit, optovn stisknut + ru oznaen),
Ins- zkopruje vechny oznaen unity z aktivnho okna do
     neaktivnho,
Del- smae oznaen unity z aktivnho okna,
Esc- ukon prci programu PPUMOVER (bez uloen zmn).


  Nkter pkazy programu PPUMOVER lze vyvolat pmo z DOSu
nsledujcm zpsobem:

PPUMOVER PURE / <parametr> <unita>

kde <parametr> me bt +, -, *  nebo ? .

Tento zpsob voln umouje provdt nsledujc operace bez
zobrazen oken:
/+ ... pid unitu <unita> do souboru PURE.TPL,
/- ... vypust unitu <unita> ze souboru PURE.TPL,
/* ... zkopruje unitu <unita> ze souboru PURE.TPL 
       do .PPU souboru,
/? ... zobraz mal okno s helpem.



  Otzky a cvien

1. Jakm zpsobem lze vybrat poloky menu IS?
2. Jak vyvolte reim IS, v nm je na cel obrazovce zobra-   
   zeno okno "Output"? Jak je rozdl mezi oknem "Output" a   
   uivatelskou obrazovkou?
3. Jak pkazy IS lze pout pi prci s helpem? Ve kterm   
   souboru je help uloen a v jakm adresi tento soubor me  
   bt?
4. Jak vyvolte editor IS? Jak jsou mdy a pepnae editoru   
   a k emu slou?
5. Kter pkazy IS lze pout pro zaveden souboru do editoru? 
   Kter pkaz editoru pouijete, chcete-li do editovanho     
   souboru vloit obsah jinho souboru?
6. Kter pkazy IS lze pout pro uloen editovanho souboru  
   na disk? V em se tyto pkazy li? K emu slou pepna  
   Options/Environment/Backup files? Kter pkaz editoru lze   
   pout pro uloen sti editovanho souboru do jinho
   souboru na disk?
7. Z jakch soubor me bt sestaven turbopascalsk program?
   Co jsou to .PPU, INCLUDE a OBJECT soubory?
8. Co vte o souboru PURE.TPL? Je nutn, aby tento soubor pi  
   prci v IS existoval a pro? m se li standardn unita   
   System od ostatnch standardnch unit?
9. Kter pkazy IS lze pout pro peklad a sestaven programu 
   nebo unity? m se tyto pkazy li? 
10. V jakch adresch mohou bt uloeny soubory, z nich je   
   pekldan program sestaven? Do kterho adrese je umstn  
   peloen kd programu a kdy? Zodpovzte analogick otzky   
   tkajc se pekladu unity.
11. Co vte o direktivch kompiltoru, jak typy direktiv kom-
    piltoru znte a k emu jsou ureny? 
12. Me mt turbopascalsk program parametry? Pokud ano, jak   
    mu je lze pedat?
14. Jak pepnae IS a jak direktivy kompiltoru se tkaj   
    ladn programu, jak mus resp. mohou bt nastaveny? K emu 
    slou okno "Watch"? Jak je rozdl mezi pkazy Run/Trace 
    into, Run/Step over, Run/Go to cursor a Run/Run? Co jsou   
    a k emu slou breakpointy?
15. Co jsou to konfiguran soubory a k emu je lze pout? 
    K emu slou PICK soubory?
16. Co vte o programech TINST.PRG a PPUMOVER.PRG?




5. Soubory

   Souborem rozumme soubor dat pijmanch z njakho vstupnho
zazen nebo vyslanch na njak vstupn zazen nebo
uloench na njakm vnjm pamovm mdiu.

   Prce se soubory tvo jednu z nejobtnjch st kadho
jazyka a to jak pro jeho tvrce, tak pro jeho uivatele. Je
tomu tak mimo jin proto, e pstup k souborm zahrnuje pstup
k nejrznjm, technicky rznorodm zazenm a m pi tom co
nejlpe vyhovovat dvma navzjem si odporujcm poadavkm:
  -  Mus logicky zapadat do celkov koncepce jazyka a bt co
     nejjednodu a pokud mono stejn pro vechna zazen.
  -  Mus co nejlpe vyuvat technick monosti jednotlivch
     prostedk.

   Na tomto mst lze ci, e zatmco standardn jazyk Pascal
jako jazyk uren pedevm pro vuku, je jednoznan podzen
prvnmu poadavku, pak jazyk systmu Pure Pascal, kter m bt
univerzlnm programovacm prostedkem pouitelnm (a
pouvanm) i pro oblast zpracovn hromadnch dat, vyhovuje v
rozumn me poadavkm obma.

   Rovn je nutn si uvdomit, e Pure Pascal pistupuje k
souborm prostednictvm operanho systmu DOS a proto jsou
soubory vytvoen v Pure Pascalu pstupn pkazm DOSu
nebo programm napsanm v jinch jazycch a naopak soubory
vytven jinmi programy nebo operanm systmem meme
zpracovvat programy napsanmi v Pure Pascalu. Proto budeme
vlastn soubor dat, tak jak je spravovan DOSem nazvat
fyzick soubor a promnnou typu soubor, kter nm v Pascalskm
programu tento fyzick soubor reprezentuje, budeme nazvat
logick soubor.


5.1. Typy soubor

   Soubory meme rozdlit do nkolika td podle nejrznjch
hledisek. To prvn, kter vyplv z povahy technickho zazen,
na kterm realizujeme fyzick soubor, nm soubory rozdl na
soubory sekvenn a soubory s pmm pstupem.
    Z hlediska deklarace logickch soubor meme soubory v
Pure Pascalu rozdlit podle pstupovch operac na:
    1. soubory zznam (File of <oznaen typu>)
    2. textov soubory (Text)
    3. primitivn soubory (File)

5.1.1. Sekvenn soubory

   Sekvenn soubory jsou takov, kde data tvo vstupn nebo
vstupn proud, do kterho data ukldme nebo z nho data teme
postupn, jednu poloku za druhou. Pstup k sekvennm souborm
je pomrn jednoduch a jak uvidme dle, nen v podstat nutno
rozliovat zazen, na kterch se soubor realizuje. Pro
nkter mdia, zejmna diskov pamti, je ovem tento pstup
ponkud neefektivn. Nicmn postauje pro adu aplikac. Ve
standardnm Pascalu jsou vechny soubory zpracovvny jako
sekvenn.

   Vstupn zazen

   Technick realizace soubor zahrnuje adu nejrznjch
zazen. V prvn ad jsou to ryze vstupn zazen, bez
nich se neobejde snad dn smyslupln program. Pat sem
zejmna monitor a tiskrna, ale teba i kreslc zazen,
drova psky, rzn speciln mechanismy a podobn. 

   Pro prci s tmito soubory potebujeme nsledujc operace:
  1. Piadit logick soubor pslunmu zazeni.
  2. Otevt soubor - tedy oznmit zazen, e se m pipravit
     na pijmn dat.
  3. Uloit do souboru (vyslat na zazen) njak data a podle
     poteby tento krok opakovat.
  4. Uzavt soubor - oznmit zazen, e prce je skonena.

    Tyto tyi innosti jsou zajitny po ad procedurami
Assign, Rewrite, Write a Close, jejich innost bude podrobn
probrna pozdji.

   Vstupn zazen

   Dalm typem zazen jsou zazen vstupn. K nim pat
zejmna klvesnice, my, joystick (pro obsluhu tchto dvou
zazen mus ovem v systmu existovat speciln rutiny),
snma drn psky, speciln mc zazen atd.

   Pro prci s tmito soubory potebujeme nsledujc
operace:
  1. Piadit logick soubor pslunmu zazen.
  2. Otevt soubor - tedy oznmit zazen, e program je
     pipraven pijmat data.
  3. Pest ze souboru (pevzt ze zazen) njak data a
     podle poteby tento krok opakovat.
  4. Uzavt soubor - oznmit zazen, e prce je skonena.

   Vidme, e kroky 1 a 4 jsou shodn jako v ppad vstupnho
zazen a proto jsou rovn zajitny procedurami Assign a
Close. Kroky 2 a 3 zajiuj procedury Reset a Read.

   Vstupn-vstupn zazen

   Zazen, kter mohou zrove slouit jako vstup i jako
vstup (komunikan rozhran) vtinou obhospodaujeme tak, e
je chpeme jako dv nezvisl zazen: jedno vstupn a jedno
vstupn. Pracujeme tedy pak se dvma logickmi soubory.

   Sekvenn pamov mdia

   Typickm sekvennm pamovm mdiem je magnetick pska. Na
zazen tohoto typu meme data zapisovat a meme z nj i
zapsan data st, nikoliv vak souasn. Zpis dat na takov
zazen probh sekvenn, zznam po zznamu a k ji napsanm
dajm nen mono se vracet a opravovat je. Zmny v zapsanch
datech meme uskutenit jedin nsledujcm postupem:
  1. Soubor existujcch dat oteveme pro ten (Assign,
     Reset).
  2. Vytvome na jinm mdiu nov soubor, kter oteveme pro
     zpis (Assign, Rewrite).
  3. teme data ze vstupnho souboru (Read), opravujeme je a
     zapisujeme je do novho souboru (Write).
  4. Oba soubory uzaveme (Close), pop. star soubor zrume.

   Je vidt,e pro pstup k tmto zazenm v podstat
vystame s prostedky, kter jsme pouvali pro pstup ke
vstupnm, respektive vstupnm zazenm.

   Jako sekvenn pamov mdium meme pout i pamov
mdia, kter obecn umouj pm pstup k datm - to jsou
zejmna diskov pamti - s tm, e kad soubor otevrme bu
pro ten (Assign,Reset) a data z nho pouze teme (Read) nebo
pro zpis (Assign,Rewrite) a data do nho pouze zapisujeme
(Write). Pi takovm pstupu k diskovm pamtem se sice
pipravme o jednu z hlavnch vhod - pm pstup - ale zato
si vrazn zjednodume ivot. 

5.1.2. Soubory s pmm pstupem

   Soubory s pmm pstupem nm oproti sekvennm souborm 
umouj v kadm okamiku pstup k libovoln poloce souboru.
Technicky to je mono realizovat jen na pamovch mdich,
kter pm pstup k zznamm umouj - to jsou zejmna
diskov pamti (pevn disky a diskety).
   Prce se soubory s pmm pstupem vychz z prce se
sekvennmi soubory, ale vyvstv navc nutnost dalch operac,
kter umon pstup k jednotlivm zznamm. Soubory s pmm
pstupem pat k nejvraznjm rozenm jazyka Pure Pascal
oproti standardnmu Pascalu.

5.1.3. Soubory zznam

   Z hlediska deklarace logickho souboru je nejjednodum
typem soubor zznam. Soubor zznam je homogenn posloupnost
sloek stejnho typu, tedy obdoba datov struktury pole. I
deklarace je podobn, deklarace typu soubor zznam se zapisuje:

   <SZ> ::= file of <oznaen typu>

kde <oznaen typu> uruje typ jednotlivch zznam a <SZ> je
zkratka pro "soubor zznam", tuto zkratku zavdme kvli
zjednoduen zpisu hlaviek standardnch podprogram.
    M-li tedy nap. F bt soubor celch sel, budeme
deklarovat:
         var F : file of integer;
    Je samozejm, e typ sloky nemus bt tak jednoduch.
Nejastji to bv strukturovan typ zznam:

         type Zaznam = record
                         p1 : integer;
                         p2 : array [1..10] of cChar;
                         p3 : real;
                       end;
         var F : file of Zaznam;

Jako typ sloky souboru nesm bt soubor dnho typu nebo
objekt (pro TP 5.5), ale v zznamu se me vyskytovat poloka
typu soubor.

5.1.4. Textov soubory

   Deklarace textovho souboru se provd pomoc
peddefinovanho identifiktoru Text, nap. 

   var F : Text;

   Soubory typu Text vychz ze soubor typu 
      file of char
ale je pro n deklarovna cel ada specilnch operac. Na
druhou stranu plat pro prci s nimi urit omezen - zejmna k
nim nen povolen pm pstup.

5.1.5. Primitivn soubory

   Pro primitivn soubory soubory jsou definovny jen
nejzkladnj operace na velmi nzk rovni operanho systmu.
Prce s primitivnmi soubory je pomrn obtn, umouj vak
zkuenmu programtorovi napsat velmi efektivn programy.


5.2. Zkladn prce se soubory zznam

5.2.1. Sekvenn soubory zznam

   Sekvenn soubory zznam pedstavuj nejjednodu typ
soubor, proto budou prvn, se ktermi se naume pracovat.

   Oteven souboru

   Prvn operac, kterou musme v programu provst, je piazen
deklarovanho logickho souboru pslunmu fyzickmu souboru.
Piazen provd procedura Assign, kter m nsledujc
deklaraci:

Ŀ
 procedure Assign ( var F : <SZ>; Name : string);           


kde F je logick soubor zznam a Name je jmno, jak m fyzick
soubor v systmu DOS. Pro toto jmno plat obvykl konvence
DOSu a nen dleit, zda jde o diskov soubor nebo njak
jin zazen. Rovn v tto fzi nen dleit, zda pslun
diskov soubor existuje nebo ne. Pokud neexistuje, pedpokld
se, e bude vytvoen. 

    Druhou operac, kterou musme udlat, je otevt soubor,
tj. informovat pslun zazen, e budeme s tmto souborem
pracovat. Ji jsme se zmnili, e k tomu slou procedury
Rewrite a Reset. Procedurou Rewrite otevrme soubor jako
vstupn, tj. pro zpis, procedurou Reset otevrme soubor jako
vstupn, tj. pro ten. Ob procedury maj obdobnou deklaraci:

Ŀ
   procedure Rewrite ( var F : <SZ>);                       


Ŀ
   procedure Reset  ( var F : <SZ>);                        


Je nutn si uvdomit, e:
  1. Ped pouitm procedur Reset nebo Rewrite mus bt
     pslunmu logickmu souboru piazen fyzick soubor
     procedurou Assign, jinak systm ohls chybu.
  2. Pokud soubor otevrme procedurou Reset a piazen fyzick
     soubor neexistuje, tak systm ohls chybu.
  3. Pokud soubor otevrme procedurou Rewrite a piazen
     fyzick soubor existuje, tak systm chybu neohls, ale
     existujc data v souboru smae.

    Pklad:

         type R2 = record 
                     P1,P2 : integer;
                   end;
              R3 = array [1..10] of char;
         var  F1 : file of char;
              F2 : file of R2;
              F3 : file of R3;
         begin 
         Assign(F1,'CON');      { Soubor F1 je piazen   }
        Reset(F1);             { klvesnici              }

        Assign(F2,'CISLA.NUM');{ Je zaloen nebo pepsn }
        Rewrite(F2);           { diskov soubor se jm-  }
                               { nem CISLA.NUM v aktiv-  }
                                { nm adresi.           }

         Assign(F3,'A:\SUBDIR\RETEZCE.TXT');
         Reset(F3); { Pokud neexistuje soubor RETEZCE.TXT }
                   { v adresi \SUBDIR na disket A:,   }
                   { pak systm v tomto mst ohls     }
                   { bhovou chybu:                      }
                   {      Runtime error 003              }
         end.

   Zpis do souboru

   Sekvenn soubory zznam otevrme pro zpis procedurou
Rewrite. Pro zpis do souboru slou procedura Write, kter m
nsledujc deklaraci:

Ŀ
 procedure Write ( var F : <SZ>; var a );                   


Prvnm parametrem procedury je logick soubor zznam, druhm
parametrem je promnn stejnho typu jako je typ zznam. Druhm
parametrem neme bt konstanta a to ani v ppadech, kdy bychom
to vcelku oekvali. Napklad nsledujc ukzka programu
nebude peloena spn:

         var  F : file of char;
         begin 
           Assign(F,'CON'); 
           Rewrite(F);
           Write(F,'A');
                 { ^                              }
                 { Error 20: Variable identifier expected. }
        end.

    Procedura Write m jet jednu formu odpovdajc
nsledujc deklaraci:

Ŀ
   procedure Write ( var F : <SZ>; var a1,... );            


Procedura Write tedy me mt i vce parametr ne dva a je
jednou z mla pascalskch procedur, u nich poet parametr
nen pevn stanoven. Pro tet a dal parametry plat ve, co
bylo eeno o parametru druhm a zpis 
    Write(F,a,b,c);
nen nic jinho, ne zkratka pro zpis
    Write(F,a);
    Write(F,b);
    Write(F,c);
kter zjevn zabr zbyten moc msta.

   Pklad:

         var  F       : file of char;
              c,cr,lf : char;
         begin 
           cr := Chr($0d); {  Znaky pro   }
           lf := Chr($0a); {  konec dku }
           Assign(F,'CON');
           Rewrite(F);
           for c:='A' to 'Z' do 
             Write(F,c);
           Write(F,cr,lf);
         end.  

   ten ze souboru

   Sekvenn soubory zznam otevrme pro ten procedurou
Reset. Pro ten ze souboru slou procedura Read, kter m 
obdobnou deklaraci jako procedura Write:

Ŀ
   procedure Read ( var F : <SZ>; var a1,... );             


a pro jej parametry plat ve, co bylo eeno pro parametry
procedury Write.

    Pro ten ze soubor potebujeme jet jednu dleitou
funkci, kter nm hld, zda jet jsou v souboru njak
nepeten data. Tato funkce se jmenuje Eof (co je zkratka End
Of File) a m nsledujc deklaraci:

Ŀ
   function Eof ( var F : <SZ>) : boolean;                  


Funkce vrac FALSE, jestlie jsou v souboru F jet njak
nepeten data a vrac TRUE, jestlie u nen co st. Parame-
trem funkce mus bt oteven  soubor. Pokus zavolat Eof na
neoteven soubor skon bhovou chybou . 103. Zavoln funkce
Eof na soubor oteven pro zpis (procedurou Rewrite) nezpsob
chybu, ale funkce vrt vdy hodnotu TRUE. 

   Nsledujc program vytvo soubor sel od jedn do sta  a
uzave ho. Pak jej znovu oteve pro ten a cel jej pete.
Pro kontrolu vype jednotliv sla na obrazovku.

    var F : file of integer;
        i : integer;
    begin 
      Assign(F,'CISLA.NUM');
      Rewrite(F);           { Zalo nov soubor.     }
      for i := 1 to 100 do 
        Write(F,i);         { Zapi do nho sla.   }
      Close(F);             { Zavi ho.              }
      Reset(F);             { Otevi znovu pro ten.}
      while not Eof(F) do   { Peti vechna sla   }
        begin               {  ze souboru a vypi je }
        Read(F,i);          {  na obrazovku.         }
        Write(i,',');
        end;
     Close(F);              { Uzavi soubor.         }
     end.

   Uzaven souboru

   Kad soubor, kter v programu pouvme, bychom mli v
okamiku, kdy ji s nm nebudeme pracovat, uzavt procedurou
Close. Tato procedura m jednoduchou deklaraci

Ŀ
 procedure Close ( var F : <SZ>);                           


a jej pouit bylo demonstrovno v pedchozch pkladech.
Neuzaven souboru nevyvol chybu, ale zpsob tkosti
operanmu systmu, kter me mt otreveno jen urit mnostv
soubor. Pokud neuzaveme soubor, do nho jsme zapisovali,
budou nm v nm mon njak data chybt.

5.2.2. Soubory zznam s pmm pstupem

    Ji bylo eeno, e soubory s pmm pstupem meme
realizovat jen na pamovch mdich, kter pm pstup
dovoluj, zpravidla jsou to diskov pamti.

    Filosofie pmho pstupu je odlin od sekvennch
soubor v nkolika bodech:
  1. Nerozliujeme soubory oteven pro ten a soubory oteven
     pro zpis. Do otevenho souboru je mono i zapisovat i z
     nho st.
  2. Pi zpisu do souboru si musme uvdomit kam, do kter
     sti souboru budeme zapisovan data ukldat.
  3. Pi ten musme analogicky rozvit z kterho msta
     souboru budeme st.

   Oteven souboru

   Pro oteven souboru s pmm pstupem pouvme stejn
jako pro soubory sekvenn procedury Assign, Reset a Rewrite,
kter maj stejnou deklaraci, jak byla uvedena dve, ale jin
vznam. Ob procedury otevraj soubor pro ten i zpis, ale: 
  a) Procedura Reset otevr existujc soubor a zachovv jeho
     obsah. Pokus otevt neexistujc soubor procedurou Reset
     zpsob stejnou chybu jako u sekvennch soubor (Runtime
     error 003). Po oteven procedurou Reset obsahuje tedy
     soubor data, kter v nm byla uloena ped otevenm.
  b) Procedura Rewrite otevr nov soubor. Pokud ji existuje
     soubor stejnho jmna, je smazn. Po oteven procedurou
     Rewrite je tedy soubor przdn.
    
   Pozorn ten si jist viml, e takto definovan innost i
voln procedur Reset a Rewrite se shoduje pln s tm, co bylo
pro n uvedeno v odstavci o sekvennch souborech. Jak tedy
systm pozn, e soubor otevrme pro pm pstup a ne pro
sekvenn? Odpov je prost:
                         N I J A K ! 
   Diskov soubory zznam jsou vdy oteveny pro pm pstup.
Cel pedchoz kapitola tedy popisuje jakousi ucelenou
podmnoinu povolench operac se soubory. Nyn se tedy seznmme
s tm, co bylo dosud utajeno. Zjistme, e procedury Read,
Write, Close a funkce Eof tak, jak byly popsny dve, tvo
zklad i pmho pstupu k souborm. Musme se na n ovem
dvat troku jinak a rozebrat jejich innost podrobnji. Budeme
tak potebovat dal operace, s nimi jsme se dosud nesetkali.

   sla zznam

   Pro pm pstup k zznamm souboru musme mt njak systm
adresovn tchto zznam. To je udlno tm nejprostm
zpsobem - zznamy jsou oslovny. Bohuel nikoliv od jedniky,
jak bychom mon oekvali, ale od nuly. Prvn zznam v souboru
m tedy slo 0, druh zznam slo 1, a tak dle.

    Strukturu
         file of <oznaen typu>;
    si tedy meme pestavit jako
         array [0..] of <oznaen typu>;





   Aktivn zznam souboru

    Prvn pojem, o kterm je nutno se dohodnout, je pojem
aktivnho zznamu souboru. Tm mnme ten zznam, kter je
"pichystn" pijmat data. To ovem musme ble specifikovat:
  1. Bezprostedn po oteven souboru, a ji procedurou Reset
     i Rewrite je aktivn zznam slo 0, tedy prvn zznam
     souboru. Pokud je soubor przdn, pak samozejm tento
     zznam fyzicky neexistuje.
  2. Po zapsn N zznam je aktivn zznam s slem o N vym,
     ne jak ml aktivn zznam ped zpisem. Tedy nap.
     proveden pkazu
           Write(F,a);
      zv slo aktivnho zznamu o jedniku. Obdobn
           Write(F,a,b,c);
      zv slo aktivnho zznamu o ti.
  3. Tot plat pro ten.

   Aktivn zznam je v Pure Pascalu to, co ve standardnm
Pascalu odpovd tzv. pstupov promnn F^.(Tento mechanismus
pstupovch promnnch a procedur Put a Get nen v Pure
Pascalu implementovn. Natst.)

   slo aktivnho zznamu nm poskytuje funkce FilePos:

Ŀ
   function FilePos ( var F : <SZ>) : longint;              


   Zpis do souboru s pmm pstupem

   Pro zpis do souboru s pmm pstupem slou nm dobe
znm procedura Write. Jestlie se na ni podvme z hlediska
prv zavedench pojm, tak operace
    Write(F,c);
zape obsah promnn c do aktivnho zznamu a aktivnm uin
zznam nsledujc, tedy zv slo aktivnho zznamu o
jedniku.
  type Zaznam=record ... end;
  var F : file of Zaznam;
    c : Zaznam;
  ...
   i := FilePos(F);
   Write (F,c);
   i := FilePos(F)-i; ...

Po tto sekvenci (pokud probhne bez chyby) je obsah promnn i
roven jedn, a u je struktura typu Zaznam jakkoliv. Nen pi
tom rovn podstatn, jak zznam byl ped tm aktivn.

    innost operace
    Write(F,a,b);
odpovd tomu, e je pouze synonymem pro zpis
    Write(F,a); Write(F,b);
a nic pekvapivho nepin.



   ten ze souboru s pmm pstupem 

   ten ze souboru s pmm pstupem zajiuje procedura Read.
Operace
    Read(F,c);
ulo do promnn c obsah aktivnho zznamu souboru F, pokud
ten fyzicky existuje. Pokud fyzicky neexistuje, tedy pokusme-
li se st za koncem souboru, zpsob to bhovou chybu Runtime
error 100. Mete si to vyzkouet:

    var F : file of integer;
        i : integer;
    begin 
      Assign(F,'CISLA.NUM');
      Rewrite(F); { Aktivn je zznam . 0, kter  }
                  { fyzicky neexistuje.            }
      for i := 1 to 10 do Write(F,i);
                  { Aktivn je zznam . 10, kter }
                  { fyzicky neexistuje.            }
                  { Existuj zznamy s sly 0..9  }
      Close(F);
      Reset(F);   { Aktivn je zznam . 0, kter  }
                  { fyzicky existuje.              }
      while not Eof(F) do Read(F,i);
                  { Aktivn je zznam . 10, kter }
                  { fyzicky neexistuje.            }
      Read(F,i);  { Tady nastane chyba!            }
    end.

   Zmna aktivnho zznamu

   slo aktivnho zznamu nm mn procedury Read a Write, pro
jeho pm nastaven slou procedura Seek, kter je deklarovna
jako

Ŀ
   procedure Seek ( var F : <SZ>; N : longint);             


a provede nastaven aktivnho zznamu souboru F na soubor s
slem N. Tedy napklad 
    Seek(F,1);
uin aktivnm zznam s slem 1, tedy druh zznam souboru.
Pkaz
    Seek(F,FilePos(F)-1);
zmen slo aktivnho zznamu o jedniku, tedy aktivnm se
stane zznam "vlevo" od toho, kter byl aktivn ped provedenm
tto operace.
  Zporn N nebo N pekraujc rozsah souboru F zpsob pi
dal operaci se souborem chybu 100 (Disk Read Error),
respektive 101 (Disk Write Error).

   Pro sna orientaci v souborech s pmm pstupem slou
funkce FileSize deklarovan

Ŀ
   function FileSize ( var F : <SZ>) : longint;             


Tato funkce vrac slo udvajc poet zznam v souboru, tedy
slo o jednu vt, ne je slo poslednho fyzicky
existujcho zznamu. Pokud si ji chcete napsat sami, prosm,
tady je nvod:

    var L,FileSize : longint;
         ...
    L := FilePos(F);    { Ulo momentln pozici v souboru.  }
    while not Eof(F) do Read(F,c); { Jdi na konec.           }
    FileSize := FilePos(F);        { To je velikost souboru. }
    Seek(F,L);          { Nvrat na pvodn pozici v souboru }


5.3. Zkladn prce s textovmi soubory

   Textov soubory jsou nejbnjmi typy soubor, s jakmi 
pracujeme. Je to proto, e jejich obsah je "lidsk", tedy data
jsou v nich uloena v dosti iteln podob. Formt textovch
soubor je toti standardizovn a respektuje jej cel kla
program. Zejmna programy pro tisk a programy pro opravovn
daj (textov editory). Zdrojov texty vtiny jazyk jsou
pekladam pedkldny rovn ve form textovch soubor.
Pure Pascal v tom nen vjimkou.

   Pipomeme, e textov soubory jsou deklarovny pomoc
peddefinovanho typu Text a ve sv postat jsou vybudovny z
typu file of char. Zkladn slokou je rovn jeden znak, 
rozdly vak jsou zejmna v tom, e :

  1) Textov soubory mohou bt oteveny pouze jako sekvenn,
     tedy bu pro zpis, nebo pro ten. K tomu mimo procedur
     Assign, Reset a Rewrite slou t procedura Append, kter
     otevr soubor pro doplovn.
  2) Nkter znaky v souboru jsou chpny jako dc a      
     maj zvltn vznam. Jsou to zejmna znaky pro konec    
     dku <CR><LF> ($0d0a) a znak pro konec souboru <EOF>
     ($1a).
  3) Procedury Write, Writeln, Read a Readln slouc pro    
     zpis, respektive ten ze souboru mohou mt zvltn
     formt. Jejich druhm parametrem toti nemus bt promnn
     typu znak.
  4) Funkce Eof m ponkud odlin vznam, ne u soubor
     zznam. Mimo ni existuje i podobn funkce Eoln.

   Budeme v tto kapitole demonstrovat vtinu pojm na
pkladech, nebo tak se nejlpe objasn jejich smysl. Pro
konstrukci pklad budeme potebovat zapisovat a st do a z
textovch soubor. Ne si podrobn rozebereme innost procedur
Write, Writeln, Read a Readln, ekneme si, e procedury Read a
Write meme pouvat stejn jako u sekvennch soubor typu
file of Char. dn omezen v tomto smru nejsou. Je tu naopak
nco navc, ale s tm se seznmme a asem.

5.3.1. Oteven souboru

   Piazen deklarovanho logickho souboru pslunmu
fyzickmu souboru provd procedura Assign, kter ji byla
popsna v pedchozch odstavcch.
   Vlastn oteven souboru provdj procedury Reset, Rewrite
a Append.
   innost a deklarace procedur Reset A Rewrite je zcela
analogick jako u sekvennch soubor zznam. Tedy procedura 

Ŀ
  procedure Rewrite ( var F : Text );                       


otevr textov soubor jako vstupn, tj. pro zpis.
Procedura

Ŀ
  procedure Reset ( var F : Text );                         


otevr soubor jako vstupn, tj. pro ten a pslun fyzick
soubor mus existovat.

   Nov je procedura Append, kter m obdobnou deklaraci

Ŀ
  procedure Append ( var F : Text );                        


Otevr existujc soubor pro zpis a to tak, e soubor oteve,
pesune se na jeho konec a vechna dal data ukld  za star
obsah, kter zstane nenaruen.

   Pklad:
       var F : Text;
           c : char;
        begin 
         Assign(F,'TXT.TXT'); { Oteven souboru TXT.TXT  }
         Rewrite(F);          { pro zpis.                }
         for c := 'a' to 'z' do 
          Write(F,c);          { Zpis znaku c do souboru. }
         Close(F);            { Uzaven souboru.         }
       end.

   Tento program nm vytvo soubor TXT.TXT a zape do nho
mal psmena anglick abecedy. Jestlie pak spustme program

       var F : Text;
           c : char;
        begin 
           Assign(F,'TXT.TXT'); { Oteven souboru TXT.TXT  }
          Append(F);           { pro pidvn textu.      }
          for c := 'A' to 'Z' do 
              Write(F,c);
           Close(F);
        end.

pipe do souboru TXT.TXT jet velk psmena.Obsah souboru
tedy bude:
   'a', 'b',...'y', 'z', 'A', 'B'...'Y', 'Z'


5.3.2. Struktura textovho souboru

   Konec textovho souboru

   Zatmco u soubor zznam se koncem souboru rozuml konec
fyzickho souboru, tedy to msto, kde kon posledn zznam v
souboru uloen, je situace u textovch soubor sloitj.   
Pro indikaci konce souboru nm opt slou funkce 

Ŀ
  function Eof( var F : Text) : boolean;                    


jej innost se vak ponkud li oproti souborm zznam.
   Funkce Eof vrt TRUE ve dvou ppadech:
  1. Jestlie peten znak je posledn ve fyzickm souboru.
  2. Jestlie za petenm znakem nsleduje znak Chr(26),   
     co je smluven znak pro konec textu.
   Jindy vrac funkce Eof hodnotu FALSE.

   Demonstrujme si to nyn na nsledujcm pkladu:
    
  var F : Text;
       c : char;
  begin 
     Assign(F,'TXT.TXT');   
     Rewrite(F);         { Otevi soubor TXT.TXT pro zpis. }
     for c := 'a' to 'e' do Write(F,c); 
                         { Zapi do nho 'abcde'.           }
     Close(F);           { Uzavi jej.                      }
      Reset(F);           { Otevi jej znovu pro ten.      }
      while not Eof(F) do { Vypi ho cel na obrazovku.      }
        begin 
         Read(F,c); { ten ze souboru.   }
         Write(c);  { Zpis na obrazovku. }
        end;
   (* Na obrazovku byla zapsna sekvence "abcde". *)

     Close(F);           { Uzavi soubor.                   }
      Append(F);          { Otevi znovu pro pidvn.      }
     Write(F,Chr(26));   { Pidej do souboru znak Chr(26).  }
     for c := 'f' to 'k' do Write(F,c);
                         { Pidej do nho 'fghijk'.         }
                         { Soubor v tomto okamiku obsahuje }
                         { 'abcde', Chr(26), 'fghijk'.      }
     Close(F);           { Uzavi soubor.                   }
     Reset(F);           { Otevi znovu pro ten.          }
     Writeln;            { Nov dek na obrazovce.         }
     while not Eof(F) do { Vypi cel soubor na obrazovku.  }
        begin 
        Read(F,c);
       Write(c);
         end;
   (* Na obrazovku byla OPT zapsna sekvence "abcde". *)
     Close(F);           { Uzavi soubor.                   }
   end.

   Prvn st programu vype na obrazovku :
  
  abcde                                             

co nen nijak pekvapiv. Pozoruhodnj je, e druh st
programu nape pesn tot a e psmena 'fghijk' se nikde
neobjev. Je to proto, e znak Chr(26) se pi druhm ten
chpe jako konec souboru a funkce Eof vrt TRUE, take ten
dle nepokrauje. Konen vstup programu vypad takto:
  
  abcde                         
  abcde                         

   Pokud bychom se na soubor TXT.TXT podvali pomoc njakho
textovho editoru - napklad editoru z integrovanho prosted
Pure Pascalu - objev se nm tak jen prvnch pt znak
'abcde'. Tedy i textov editor se u znaku Chr(26) se tenm
zastav. Stejnou zkuenost udlme, kdy vypeme soubor TXT.TXT
pkazem TYPE operanho systmu.
   Dokonce i pkaz PRINT (z DOSu) nm vytiskne a pkaz
COPY (z DOSu) zkopruje jen tch prvnch pt znak. Znak
Chr(26) je prost magick zarka a neplat to jen pro Pure
Pascal. Pesnji eeno, v Pure Pascalu je to tak udlno
prv proto, e se tak chovaj i ostatn systmy.

   Pure Pascal znak Chr(26) na konec souboru sm nezapisuje
(na rozdl od vtiny editor) a pokud ho tam chceme mt
(nkter programy to vyaduj), tak ho musme ped uzavenm
souboru explicitn zapsat.
   teme-li soubor z klvesnice, pak znaku Chr(26) odpovd
kombinace klves Ctrl-Z zapisovan nkdy t jako ^Z.

   Pro textov soubory existuje jet jedna funkce pro zjitn
konce souboru.

Ŀ
  function SeekEof ( var F : Text) : Boolean;               


innost tto funkce je obdobn jako innost funkce Eof s tm
rozdlem, e funkce nejprve pesko vechny mezery, tabelan
znaky a znaky konce dku (viz dle). Teprve, kdy naraz na
znak jinho charakteru nebo na konec souboru, zastav se a
vrt hodnotu, jakou by vrtila funkce Eof.
   S spchem lze tto funkce vyut napklad pro ten sel
z textovho formtu.

   dky textovho souboru

   Zatm nic z toho, co jsme o textovch souborech ekli, by
neoprvnilo jejich existenci. Nejdleitjm rysem textovch
soubor, ke ktermu se dostvme a nyn, je lenn textu na
dky. lenn textu na dky je lidem vlastn. Nejbnjm
mdiem, na kterm si v tomto stolet lid pedvaj a pedvali
zprvy, je list papru, na kterm je text napsn jako
posloupnost samostatnch dek. Pro tomu tak je, to by jist
dokzali vysvtlit psychologov (i kdy to zce souvis s
matematikou - je to otzka plochy, rozmr a orientace) ale
dleit je skutenost, e mlokdo je ochoten pracovat s textem
lennm jinm zpsobem. Nevm, koho by napklad potilo,
kdyby dostal do ruky tuto publikaci napsanou jako jeden souvisl
dek vytitn na zhruba ti a pl kilometru dlouh a centimetr
irok paprov psce. Co ovem je pesn to, co odpovd
datov struktue file of Char.

   Zkladnm rozdlem mezi souborem typu Text a souborem typu
file of Char je v tom, e soubor typu Text je lenn na dky
(lines). lenn na jednotliv dky je provdno pomoc
specilnho znaku, kter se v pascalsk literatue vtinou
popisuje jako "znak pro konec dky". Konkrtn podoba tohoto
znaku je zce vzan na typ operanho systmu. V systmu DOS
a tm i v systmu Pure Pascal je to DVOJICE znak <CR><LF>, kde
znak <CR> (Carriage Return - znak pro pechod na zatek dku
- doslova "nvrat vozku") m hodnotu Chr(13) a znak <LF> (Line
Feed - znak pro pechod na nov dek) m hodnotu Chr(10).

   Tak jako funkce Eof nm slou pro zjitn, zda ji jsme na
konci souboru, tak mme k dispozici funkci, kter nm slou k
tomu, abychom zjistili, zda ji jsme na konci dku. 

Ŀ
  function Eoln ( var F : Text) : boolean;                  


kter nabv hodnoty TRUE, je-li dalm znakem znak <CR> a
hodnoty FALSE jinak. Funkce Eoln se tedy vztahuje pouze ke
znaku <CR> a nikoliv ke znaku <LF>. Pesto musme povaovat za
konec dku celou dvojici <CR><LF>.

   Mimo funkci Eoln lze pout jet funkci 

Ŀ
  function SeekEoln ( var F : Text) : boolean;              


kter pesko v souboru mezery a tabelan znaky a potom ns
informuje, zda ji jsme na konci dku.

   Jako pklad uvedeme proceduru, kter textov soubor (ji
oteven pro ten) pepe na obrazovku s tm, e kad vskyt
znaku <CR> nebo dvojice <CR><LF> nahrad znakem mezera.

  procedure Vypis( var F : Text);
   var c : char;
   begin 
   while not Eof(F) do  { dokud nebude konec souboru }
      begin 
      while not (Eoln(F) or Eof(F)) do { do konce dky nebo }
                                       { souboru             }
         begin  
         Read(F,c);     { peti znak           }
         Write(c);      { zapi ho na obrazovku }
         end; (* while not Eoln... pkazu *)
   { Te je bu konec dky nebo souboru ! }
      if not Eof(F) then 
          begin             { Nen to konec sounoru !  }
          Read(F,c);        { Peti znak - je to <CR> }
          Write(' ');       { Msto nho mezeru.       }
          Read(F,c);        { Peti znak.             }
         if (c <> Chr(10)) { Kdy je to <LF>, tak ho  }
             then Write(c); {  zaho, jinak opi.      }
          end; (* if not Eof pkazu *)
      end; (* while not Eof pkazu *)
   end; (* of Vypis *)

   Pro sna zachzen s dky mme k dispozici pro textov
soubory dv dleit procedury, se ktermi se podrobnji jet
seznmme pozdji. Je to v prvn ad procedura Writeln ("Write
line" - zapi dek), kter je ve sv nejjednodu podob
deklarovna jako

Ŀ
  procedure Writeln ( var F : Text);                        


a neudl nic jinho, ne e do textovho souboru F otevenho
pro zpis zape <CR><LF>.

   Zpis
       Writeln(F)
   je tedy jen synonymem pro zpis
       Write(F,Chr(13),Chr(10));

   Protjek tto procedury se jmenuje Readln ("Read line"
- peti dek) a je deklarovn nsledovn:

Ŀ
  procedure Readln ( var F : Text);                         


Tato procedura pejde na zatek dalho dku v souboru F,
neboli pesko v souboru F vechny znaky a do nejbliho
vskytu znaku <CR> nebo dvojice <CR><LF> vetn.

   Pklad:

   var F : Text;
       c : char;

   begin
      Assign(F,'TXT.TXT'); { Oteven souboru TXT.TXT  }
      Rewrite(F);          { pro zpis.                }
      Write(F,'a','b','c');{ Zapi 'abc'.              }
      Writeln(F);          { Zapi <CR><LF> neboli     }
                           {  ukoni dek.            }
      Write(F,'d','e','f');{ Zapi 'def'.              }
      Write(F,Chr(26));    { Zapi konec souboru.      }
      Close(F);            { Uzavi soubor.            }

      Reset(F);            { Otevi znovu pro ten.   }
      Read(F,c);           { Peti znak ze souboru.   }
      Write(c);            { Napi ho na obrazovku.    }
      Readln(F);           { Sko na za. dal dky. }
      Read(F,c);           { Peti znak ze souboru.   }
      Write(c);            { Napi ho na obrazovku.    }
      Close(F);            { Uzavi soubor.            }
    end.

   Kdo pochopil pedchoz vklad, tak je mu jasn, e tento
program nape na obrazovku :

  
  ad                        

nebo tmito znaky zanaj dva dky vytvoenho souboru.

5.3.3. Zpis do textovho souboru

   Pro zpis do textovch soubor slou pedevm procedura
Write, se kterou ji jsme se setkali a kter m deklaraci

Ŀ
  procedure Write ( var F : Text; a1,... );                 


   Do soubor typu text jsme doposud zapisovali, jako kdyby to
byly soubory typu file of Char, ze kterch samozejm vychzej.
Nyn ovem narme na druhou podstatnou vc, kter dl
textov soubory tolik zajmav. Je to skutenost, e druh a
dal parametry procedury Write 
  1. nemus bt typu char
  2. nemus ani bt stejnho typu 
  3. nemus to bt promnn, ale mohou to bt vrazy a dokonce
     vrazy specilnho typu (formty)
Parametry procedury Write ovem nemohou bt jakkoliv, protoe
pro nkter typy si lze jen st pedstavit, jak by se
konvertovaly na textovou podobu, ale kla typ, kter me
vystupovat v procedue Write je dosti irok. 

   Vystupujc vrazy mohou bt typu :
       char,
       string,
       znakov etzce (array [...] of char),
       integer a dal celoseln typy (longint, byte...),    
       boolean,
       real a dal reln typy (double,...),

   Parametry pkazu Write maj speciln deklaraci

                                                   Ŀ Ŀ
   <Parametr_Write> ::= <Vraz>  : <Vraz>  : <Vraz>   
                                                    

Prvn vraz oznauje hodnotu, kter bude do souboru zapsna (po
ppadn konverzi), druh (nepovinn) vraz oznauje poet
znak, kter nejmn budou zpisu vnovny a mus bt
celoselnho typu. Tet vraz, rovn celoselnho typu a
rovn nepovinn, lze pout jen pro zpis relnch vraz a
udv poet desetinnch mst vstupu.

   Pklady :
           'A'
           'AHOJ' : 2
           123 : 3 : 1

   Zpis znak

   Zpis znaku pedstavuje nejjednodu zpis do souboru typu
Text. Znaky jsou ukldny pesn jako do souboru typu file of
char, pokud nen uvedena formtov specifikace, tedy pokud za
vrazem typu znak nensleduje dvojtekou oddlen celoseln
vraz, kter udv, na kolik mst bude znak zapsn.
   Pokud formtov specifikace zadna je a pokud je tento
celoseln vraz men nebo roven jedn (me bt i zporn)
zape se do souboru prost prv jen zapisovan znak, tedy
formtov specifikace je ignorovna. Pokud je formtov
specifikace vt ne jedna, zape se nejprve tolik mezer, aby
dohromady se znakem daly poet uren formtovou specifikac.
   Pklady:
       Write(F,'>', '*':0, '<'); nape do souboru F ">*<"
       Write(F,'>', '*':1, '<'); nape do souboru F ">*<"
       Write(F,'>', '*':2, '<'); nape do souboru F "> *<"
       Write(F,'>', '*':3, '<'); nape do souboru F ">  *<"

   Zpis etzce
   
   Zpis etzce do textovho souboru probh jako zpis jeho
jednotlivch znak. Pokud nen uvedena formtov specifikace,
zap se do souboru postupn vechny znaky, kter etzec
obsahuje. Pokud je uvedena formtov specifikace a jej hodnota
je stejn nebo men jako dlka etzce, je situace stejn.
Pokud je formtov specifikace vt, dopln se opt vystupujc
etzec zleva mezerami.

   Pro zpis znakovch etzc (vrazy typu array [...] of
char) plat stejn pravidla.

   Zpis celoselnch vraz

   Celoseln vrazy jsou konvertovna do sv textov podoby
obvyklm zpsobem, to jest pomoc cifer destkov soustavy,
tedy tak, jak sla bn zapisujeme. Znamnko se na zatku
zape jen tehdy, kdy vraz je zporn, pak se nape mnus,
znamnko plus se nezapisuje. slo je zapsno bez vedoucch
nul, tedy prvn slice zleva nen nikdy nula.
   Pokud nen uvedena dn formtov specifikace, nebo pokud
je men, ne kolik znak je zapoteb na dn zapsn sla,
tak se ani ped, ani za slo nezap dn mezery. Pokud je
uvedena formtov specifikace vt, ne je nutn poet mst,
dopln se vstupn etzec obsahujc zpis sla zleva
mezerami.

   Zpis logickch vraz
   
   Logick vrazy jsou zapisovny, jako kdyby to byly etzce
'TRUE', respektive 'FALSE'.

   Zpis relnch vraz

   Nejbnj situac je zpis vrazu typu Real pi nastaven 
pepnae {$N-}. Tento ppad budeme nadle popisovat.
Podrobnj rozbor lze nalzt u popisu innosti procedury Str,
kter provd konverzi stejnm zpsobem, nikoliv vak do
vstupnho souboru, ale do etzce (viz 2.2.5).

   Reln vrazy jsou rovn zapisovny ve sv obvykl form,
tedy v destkov soustav s desetinnou tekou a ppadn
znamnkem mnus a pokud nen ureno jinak,tak v exponencilnm
tvaru.

   Nen-li urena druh formtov specifikace, m zpis relnho
vrazu syntax:

   { |-}<slice>.<desetinn st>E{+|-}<exponent>  

kde prvnm znakem je mnus, pokud je vraz zporn, a mezera
pokud je vraz kladn. Nsleduje slice, kter je rovn nule
jen pro nulov vraz a po desetinn tece nsleduje
deseticifern cel slo bez znamnka, kter udv desetinnou
st sla. Pak najdeme v zpisu velk psmeno E, kter oddluje
mantisu od exponentu a za nm znamnko exponentu. Konen zpis
je uzaven dvojcifernm exponentem. Celkem tedy zabr tento
zpis 17 znak.

   Pokud zadme pouze prvn formtovou specifikaci a zadme ji
vt, ne 17, je doplnn tento zpis zleva mezerami. Pokud
zadme pouze prvn formtovou specifikaci a zadme ji men ne
17, je tento zpis zkrcen na kor desetinn sti, ale tak, e
j zstane alespo jedno msto. Snadno spoteme, e takov
zpis zabr 8 mst.
   Pokud zadme i druhou formtovou specifikaci, a ta je
zporn, systm ji ignoruje a chov se tak, jako kdyby zadna
nebyla. Vstup tedy vypad tak, jak bylo prv popsno.

   Pokud zadme i druhou formtovou specifikaci, je slo
zapsno ve formtu s pevnou desetinnou tekou (semilogaritmick
tvar), tedy ve formtu, kter odpovd popisu :

         Ŀ  Ŀ                              Ŀ
    ' '...   -  <cel st>  .<desetinn st> 
                                         

   Jestlie je druh formtov specifikace vt ne 11,
povauje se za rovnou jedencti. Tato druh formtov
specifikace udv, kolik slic bude mt desetinn st.Jestlie
prvn formtov specifikace je vt, ne kolik je zapoteb na
korektn zapsn znamnka, cel sti, desetinn teky a
desetinn sti (jej dlka je urena druhou formtovou
specifikac), je zpis zleva doplnn mezerami.
   Pokud je prvn formtov specifikace men, ne je zapoteb,
nen brna v vahu.

   Zpis dky

   Mimo proceduru Write meme pout i proceduru Writeln, se
kterou jsme se ji seznmili a kter m plnou syntaxi:

Ŀ
  procedure Writeln ( var F : Text; [a1,...] );             


   Prvnm parametrem je textov soubor. Pokud je to parametr
jedin, zape procedura pouze znak konce dku <CR><LF>.      
Pokud je uveden druh a dal parametry, pak jsou zapsny do
souboru stejn, jako kdyby byly pedny procedue Write a po
jejich zapsn je teprve zapsn znak konce dku.
   Zpis
       Writeln(F,a,b,c);
   je tedy jen zkratkou zpisu
       Write(F,a,b,c);
       Writeln(F);

5.3.4. ten z textovho souboru

   Pro ten z textovch soubor nm slou procedura Read,
kter m deklaraci

Ŀ
  procedure Read ( var F : Text; var a1,... );              


   Pro ten ze soubor typu text plat podobn pravidla jako
pro zpis do nich. Plat tedy opt, e druh a dal parametry
procedury Read
   1. nemus bt typu char
   2. nemus ani bt stejnho typu 
   3. ale mus to bt promnn.

   Promnn, do kterch jsou data tena, mohou bt typu :
       char
       string
       celoselnho typu (integer, longint, byte...)
       relnho typu (real, double,...)

   ten znak

   O ten znak z textovho souboru ji bylo eeno ve.

   ten etzc

   Pokud je vstupnm parametrem procedury Read promnn typu
etzec, jsou ze souboru natny do etzce znaky tak dlouho,
dokud se pi ten nenaraz na konec dku nebo konec souboru.
Znak konce dku nebo souboru peten nen. 
   Dal ten ze souboru tedy zan znakem konec dku.
Uvdomte si prosm, e to mimo jin znamen, e pokud teme
bezprostedn za sebou procedurou Read dva etzce, pak druh
mus bt nutn przdn. Peten prvnho toti nastav pozici na
znak konce dku, tm je splnna podmnka Eoln a tud dal
etzec nic nepete. D se tomu odpomoci tak, e peteme znaky
konce dku do pomocn promnn a pak teprve teme dal
etzec. Situaci za ns ovem bezpen vye procedura Readln,
kterou popeme dle.

   Pokud jsou naten data del, ne je kapacita etzce (jeho
maximln mon dlka), pak je uloeno jen tolik znak, kolik
se do etzce vejde, ostatn jsou peteny, ale nejsou uloeny
a ztrat se. Dynamick dlka etzce se nastav podle potu
petench znak.

   ten celoselnch promnnch

   Pokud je vstupnm parametrem procedury Read promnn
celoselnho typu, tak se pi ten nejprve pesko vechny
mezery, tabeltory a znaky pro konec dku. Pak se natou znaky
a k prvnmu dalmu vskytu mezery, tabeltoru, znaku pro konec
dku nebo do konce souboru. Naten znaky se pokus peklada
interpretovat jako celoselnou konstantu podle jej deklarace.
Pokud se mu to poda, ulo tuto hodnotu do promnn, v opanm
ppad ohls chybu Runtime error 106. Dal ten zan
prvnm nepetenm znakem, tedy prvn mezerou, tabeltorem
atd., kter nsleduje za zpisem petenho sla.
   Pokud se program pokus pi ten sla st za koncem
souboru, ulo se do promnn hodnota 0.
   Doporuujeme prostudovat popis procedury Val, kter s
pkazem Read zce souvis.

   ten relnch promnnch

   Pokud je vstupnm parametrem procedury Read promnn typu
Real, je situace zcela analogick jako pi ten celoseln
promnn s jedinm rozdlem, e hodnota, kterou program oekv,
me bt zapsna v rmci pravidel pro zpis literlu relnho
sla.

   Peten dku

   Mimo proceduru Read meme pout pro ten z textovho
souboru i proceduru Readln, o jej zjednoduen form jsme se
ji zmnili. Uveme jej plnou syntaxi:

Ŀ
  procedure Readln ( var F : Text; [var a1,...] );          


   Prvnm parametrem je textov soubor. Pokud je to parametr
jedin, pesko procedura vechny znaky do konce dku vetn. 
    Pokud je uveden druh a dal parametry, pak jsou nateny
ze souboru stejn jako procedurou Read a po jejich peten
jsou zbvajc znaky na dce peskoeny.
   Zpis
       Readln(F,a,b,c);
   je tedy jen zkratkou zpisu
       Read(F,a,b,c);
       Readln(F);

5.3.5. Uzaven textovho souboru

   Uzaven textovho souboru se provd nm ji znmou
procedurou

Ŀ
  procedure Close ( var F : Text);                          


a jej innost se neli oproti tomu, co bylo eeno u soubor
zznam.

5.3.6. Standarn soubory Input a Output

   V Pure Pascalu jsou peddefinovan dva textov soubory:

   var Input, Output : Text;

   Po sputn programu provede jet ped vykonnm prvn
instrukce programu inicializan rutina oteven obou soubor.
   Soubor Input je piazen standardnmu vstupu programu, co
je implicitn klvesnice, ale je mon to zmnit pi voln
programu pomoc pesmrovn vstupu nebo pomoc spojovn
program jako filtr. Pak je soubor Input oteven pro vstup
(Reset).
   Soubor Output je piazen standardnmu vstupu programu, co
je implicitn monitor, ale opt je mon to zmnit pi voln
programu.

   Soubory Input a Output maj v pascalskch programech zvltn
postaven. Pro operace s nimi toti nen nutno je uvdt jako
parametry pslunch procedur a funkc. Plat, e jakmile u
procedury Write nebo Writeln nen prvnm parametrem
identifiktor textovho souboru, pak se tyto pkazy chpou tak,
e se odkazuj na standardn vstupn soubor Output. Napklad
instrukce
       Write(Output,'ABC');
je zcela ekvivalentn instrukci
       Write('ABC');

   Analogicky je tomu u procedur Read a Readln, u kterch,
pokud prvnm parametrem nen textov soubor, se pedpokld, e
se vztahuj ke standardnmu vstupnmu souboru Input. Rovn
funkce Eof, Eoln, SeekEof a SeekEoln, pokud jsou uvedeny bez
parametru, testuj stav souboru Input.

   Pesmrovn soubor Input a Output lze provst i uvnit
programu pomoc procedury Assign. Soubor nejprve uzaveme,
provedeme nov piazen jinmu fyzickmu souboru a opt
oteveme. Napklad nsledujc ti pkazy pesmruj veker
vstup, kter jde do souboru Output na tiskrnu:

   Close(Output);
   Assign(Output,'PRN');
   Rewrite(Output);

Po proveden pedchzch t pkaz zpsob 
   for c := 'a' to 'z' do Write(c);
vypsn malch psmen anglick abecedy na tiskrnu.
Obdobn lze zachzet se souborem Input.
  Poznamenejme, e unita Crt, pokud je pipojena k programu
(klauzul uses), piad logick soubory Input a Output
"napevno" fyzickmu souboru 'CON', tedy klvesnici a monitoru.
Ve vtin ppad se to nijak neprojev, nebo to odpovd
implicitnmu piazen operanho systmu, ale pesmrovn pi
voln programu pak nen mon.

5.3.7. Klvesnice jako textov soubor

   Nejastjm vstupnm fyzickm souborem je klvesnice. Jako
logick soubor k n bv nejastji pipojen soubor Input. A
prv klvesnice psob asto zatenkm jako vstupn soubor v
programech adu obt.

   Pokusme se chovn klvesnice demonstrovat na nkolika
pkladech. Budeme nadle pedpokldat, e standardn soubor
Input je piazen klvesnici, tedy e je piazen standardn a
nikdo ho nepesmroval.

   Vme, e nejjednodueji se z textovho souboru te znak.
Zkusme si tedy znak z klvesnice pest.

 var c : char;
 begin 
   Write('Zadej znak >');
   Read(c);
   Writeln('Byl to znak >',c);
  end.

   Spustme program a nejprve se na obrazovce objev vzva
  
  Zadej znak >                     

A vedle n blik prompt. Zmknete tedy poslun klvesu,
eknme teba "A". Psmenko nasko vedle vzvy a kursor blik
dl a nic se nedje. Na obrazovce mte te:
  
  Zadej znak >A                     

Tak mu zmknete postupn jet teba B,C a D. Vechno to
poslun nasko na obrazovku
  
  Zadej znak >ABCD

ale jinak pod nic. Te tedy u vs to pestalo bavit a zmkli
jste <ENTER> (<RETURN>). A vci se zanou dt. Objev se nov
dek:
  
  Zadej znak >ABCD
  Byl to znak >A

a program skon. Instrukce Read tedy ek, a potvrdme svj
znak klvesou <ENTER> a pokud jich zadme vce, vezme si jen
ten prvn. Dleit je, e dal instrukce Read(c) ji zadn
znaku z klvesnice nevyaduje a vezme si dal ped tm zadan
znak. (V naem ppad by to byl znak 'B'.)

 var A : array [1..10] of char;
     i : integer;
 begin
   Write('Zadej 10 znak >');
   for i := 1 to 10 do Read(A[i]);
   Write('Byly to znaky s kdy>');
   for i := 1 to 10 do Write(' #',Ord(A[i]));
  end.

Zkuste si s tmhle progrmkem hrt, zadvat mu rzn
kombinace, prokldejte normln znaky s klvesou <ENTER>,
s editanmi klvesami, s klvesou <ESC> a dalmi. 

   Mli by jste pi tom zjistit, e:
  1. Zadvan znaky mete voln opravovat podobnm zpsobem,
     jakm se nap v DOSu opravuj pkazy zadvan z
     promptu. Je jedno, co napete, dokud to neodelete
     klvesou <ENTER>
  2. Co odelete klvesou <ENTER>, se ulo do bufferu
     klvesnice, odkud si znaky systm postupn odebr, dokud
     tam njak jsou. Samotn <ENTER> se ulo do souboru jako
     znaky konce dku, tedy jako <CR><LF>. Kdy znaky v bufferu
     dojdou, ekne si systm o dal.

   pln stejn funguje zadvn dat jinho typu. Jedin snad
lze upozornit na astou chybu, kter spov v tom, e kdy po
vs program chce vce sel, tak je oddlte rkami. Pascal to
nem rd.

   Obecn lze doporuit pro vstup z klvesnice proceduru Readln
vude, kde je to mon, tedy tam, kde neteme vce promnnch z
jednoho dku. Uet vm to mnoh komplikace.


5.4. Dal operace se soubory

5.4.1. Smazn souboru

Ŀ
  procedure Erase ( Var F );                                


   Procedura Erase slou ke smazn vnjho diskovho souboru.
Jejm parametrem me bt logick soubor libovolnho typu
ktermu je piazen pslun fyzick soubor. Soubor nesm bt
oteven.
   Nsledujc pklad smae diskov soubor TXT.TXT v aktivnm
adresi, pokud tam existuje. V opanm ppad program hls
chybu Runtime error 002:

 var F : file;
 begin
    Assign(F,'TXT.TXT');
    Erase(F);
 end.

5.4.2. Zmna aktivnho adrese

Ŀ
  procedure ChDir ( s : string );               { Dos }     


   Tato procedura mn aktivn adres. Je pmou obdobou
pkazu CHDIR v DOSu. V tto souvislosti lze poznamenat, e v
Pure Pascalu se pkazy, kter se odkazuj na vnj soubory
vztahuj vdy, pokud nen uvedena cel cesta jen k aktivnmu
adresi. Adrese pipojen pkazem DOSu APPEND se
neprohledvaj.
   Pklad ChDir('\user\jana')

5.4.3. Zjitn volnho msta na disku

Ŀ
  function DiskFree ( Drive: byte ) : longint;  { Dos }     


   Tato funkce ns informuje o tom, kolik je na pslunm disku
volnho msta. slo drive se zadv podle nsledujcho kle:
       drive 0 = aktivn disk
             1 = A:
             2 = B:
              ...atd.
   Vsledn hodnota je v bytech.

5.4.4. Zjitn kapacity disku

Ŀ
  function DiskSize ( Drive: byte ) : longint;  { Dos }     


   Vrac celkov msto na diskovm mdiu v bytech.
slo drive se zadv stejn jako u funkce DiskFree.
   Pklad:
   Writeln('Na disket A: je obsazeno ',
           (DiskSize(1)-DiskFree(1)) div 1024 ,' KB.');

5.4.5. prava jmna souboru i adrese

Ŀ
  function FExpand ( Path: PathStr ) : PathStr; { Dos }     


   Kde PathStr je typ deklarovan v UNITu Dos jako 
  type PathStr = String[79];
   Tato funkce upravuje jmno diskovho souboru do jeho pln
podoby.Pokud je parametrem funkce jmno vetn pstupov cesty,
pak zmn pouze mal psmena na velk. Pokud chyb pstupov
cesta, nebo pokud je napsna jako relativn (tedy pokud nezan
obrcenm lomtkem), dopln ji aktulnm adresem. Pokud chyb
disk, nape tu diskovou jednotku, kter je aktivn. 

   Pedpokldejme napklad, e aktivn je diskov jednotka C:,
aktivn adres je \USER\JANA. Pak funkce
       FExpand('TEXT\TXT.TXT') vrt etzec 
       'C:\USER\JANA\TEXT\TXT.TXT'
   Nen pitom vbec podstatn, zda takov soubor existuje.
Poznamenejme jet, e FExpand('') vrac plnou cestu k
aktivnmu adresi.

5.4.6. Nalezen soubor na disku

Ŀ
  procedure FindFirst(P:string;A:word;var S:SearchRec);{Dos}


   Tato procedura hled diskov soubor se jmnem nebo cestou
specifikovanou parametrem P a s atributy specifikovanmi
parametrem A. Parametr S, kter je peddeklarovanho typu
SearchRec je pracovn a slou jako vstupn parametr a pro
nsledn voln procedury FindNext. Opt je soust unity Dos.

type SearchRec =
       record
          Fill: array [1..21] of byte;
          Attr: byte;               { Attributy souboru.    }
          Time: longint;            { as zaloen souboru. }
          Size: longint;            { Velikost v bytech.    }
          Name: string[12];         { Jmno souboru.        }
       end;

   Parametr P specifikujc cestu me obsahovat i nhradn
znaky DOSu (wildcards), ktermi je mono popsat celou tdu
jmen soubor. Jako nhradn znaky se pouvaj otaznk, kter
zastupuje libovoln znak a hvzdika, kter zastupuje libovoln
poet libovolnch znak. V podstat jako parametr P lze pout
libovoln etzec, kter lze pout jako prvn parametr
DOSovskho pkazu DIR.

   Parametr A uruje atributy, kter mohou mt hledan soubory.
Pokud zadme A = 0, budou se prohledvat pouze normln soubory,
kter nemaj nastaven dn atribut. Pokud chceme prohledvat i
njakou speciln tdu soubor (kupkladu soubory s atributem
R, tedy soubory chrnn proti zpisu) musme pslun kd
atributu tto tdy pist do parametru Attr.
   Korektnji eeno: Soubor je pijat, pokud souhlas jeho
jmno a pokud jeho atributov slovo dv s parametrem Attr
logick souet rovn parametru Attr.
   Jednotliv kdy jsou peddeklarovny jako konstanty:
       ReadOnly  = $01;  { Soubory s atributem R. }
       Hidden    = $02;  { Soubory s atributem H. }
       SysFile   = $04;  { Soubory s atributem S. }
       VolumeID  = $08;  { Label diskety.         }
       Directory = $10;  { Podadres.            }
       Archive   = $20;  { Soubory s atributem A. }
       AnyFile   = $3F;  { Jakkoliv soubor.      }
   Pomoc stejnho kle meme rozlutit i atributy nalezenho
souboru. Slou nm k tomu poloka Attr parametru S.

   Pokud procedura FindFirst najde soubor, kter odpovd
specifikovanm poadavkm, ulo jeho "nacionle" do parametru S
a hodnota globln promnn DosError bude rovna nule. Pokud
dn takov soubor nalezen nen, bude hodnota promnn 
DosError nenulov a pravdpodobn bude obsahovat bu hodnotu 2
(Directory Not Found) nebo hodnotu 18 (No More Files).

   Proceduru FindFirst dopluje 

Ŀ
  procedure FindNext ( var S : SearchRec );     { Dos }     


   kter slou k vyhledn dalho souboru, kter vyhovuje
specifikaci pedloen procedue FindFirst. K voln procedury
FindNext jako parametr pouijeme zskanou hodnotu parametru S,
kterou vrtila procedura FindFirst. Vstupem tto procedury je
opt parametr S, kter lze optovn pout jako vstup pro dal
voln te rutiny. Nastaven promnn DosError a obsah
parametru S je analogick jako u procedury FindFirst.

   Nsledujc pklad je program ,kter vype vechny adrese
disku, kter byl zadn pi voln programu v hlavice jako
prvn parametr.

uses Dos;          { V tomto UNITu jsou vechny    }
var S : string;    {   potebn deklarace.         }

procedure WriteDirectories( RootName : string );
   { Parametrem tto procedury je jmno adrese a procedura
     vype jeho podadrese. K tomu rekurzivn vol sama
    sebe.}
var S : SearchRec;
    P : string;
begin
   P := RootName+'\*';        {Sestavit masku pro hledn.}
   FindFirst(P,Directory,S);  {Hledej prvn podadres.   }
  if DosError <> 0 then      { Nael ? }
      begin
      Writeln('Nen takov adres');
      Halt;      {Pkaz k okamitmu ukonen programu}
      end;
   repeat
      if (S.Attr = Directory) and (S.Name[1] <> '.') then 
         begin    { Nael podadres }
         Writeln(RootName+'\'+S.Name);     { Napi ho.}
         WriteDirectories(RootName+'\'+S.Name);
                                     { A pus se do nj ! }    
         end;
      FindNext(S);                   { Hledej dal.       }
  until DosError <> 0;              { doku njak jsou.  }
end; (* procedury WriteDirectories *)

begin
    S := ParamStr(1);        { Vezmi jmno disku      }
    s := Copy(s,1,2);        { Uprav na sprvn tvar. }
    s[2] := ':';
    WriteDirectories(S);     { Zavolej proceduru.     }
end.

   Funkce ParamStr nm slou k pedn parametr programu
zadanch z pkazovho dku pi voln. ParamStr(1) vrt  v
podob etzce prvn z tchto parametr. Podrobnji kapitola
7.2.

5.4.7. Nalezen souboru v seznamu adres

Ŀ
  function FSearch (P:PathStr;DirList:string):PathStr;      


   Hled soubor specifikovan parametrem P v seznamu adres
kter je popsn druhm parametrem DirList. Opt je soust
unity Dos.
    Funkce vrac jmno souboru, pokud bylo hledn spn, a
przdn etzec v opanm ppad.
   Jednotliv adrese v etzci DirList jsou uvedeny jeden za
druhm a oddleny stednkem. Tato syntaxe je obdobn jako pro
parametry DOSovskch pkaz APPEND a PATH.
   V popisu souboru v parametru P nemohou figurovat nhradn
znaky. 
   Pipomeme, e typ PathStr je deklarovn jako String[79].
Tuto funkci lze vhodn vyut napklad pro hledn v
adresch zadanch v DOSu pkazem APPEND. Tyto adrese
normln Pure Pascal neprohledv, ale meme si pomoci tm, e
kdy zadme v AUTOPRGCu pkaz APPEND /e, budou vechny dal
pkazy APPEND ukldat svj argument, tedy seznam adres,
kter se maj prohledvat do environmentu jako promnn se
jmnem APPEND. Tuto promnnou z environmentu meme pest jako
hodnotu funkce GetEnv('APPEND'). 
  Podrobnosti o tto funkci najdete v kapitole 7.3.

   Pouit funkce budeme demonstrovat na programu, kter jako
parametr dostane jmno souboru a prohldne aktuln adres a
vechny adrese pipojen pkazem DOSu APPEND a pokud tam
takov soubor nalezne, nape k nmu plnou pstupovou cestu.
Pokud takov soubor nenalezne, nape o tom zprvu.

   uses Dos;
   var x,ApList : string;
       i : integer;
    begin
       ApList := GetEnv('PATH')+FExpand('')+';';
       x := FSearch(ParamStr(1),ApList);
       if Length(x) <> 0 then Writeln(FExpand(x))
                         else Writeln('Soubor nenalezen!');    
  end.

5.4.8. Rozdlen jmna souboru na sloky

Ŀ
  procedure FSplit(P:PS;var D:DS;var N:NS;var E:ES);        


kde PS=PathStr, DS=DirStr, NS=NameStr, ES=ExtStr, procedura je
soust unity Dos.

   Rozdl jmno diskovho souboru zadan parametrem P na ti
sti:
       Adres - D : DirStr,
       Jmno   - N : NameStr,
       Ppona - E : ExtStr.

       Typy parametr jsou definovny v UNITu Dos nsledovn :
  type PathStr = string[79]; 
       DirStr  = string[67];
       NameStr = string[8];
       ExtStr  = string[4];

  Pklad:

       uses Dos;
       var D : DirStr;
           N : NameStr;
           E : ExtStr;
        begin
           FSplit('C:\USER\JANA\DATA.TXT',D,N,E);
           Writeln(D);
           Writeln(N);
           Writeln(E);
        end.

Vstup programu bude vypadat nsledovn :

C:\USER\JANA\
DATA
.TXT

   Procedura FSplit nen vlastn souborov orientovanou rutinou,
je to procedura pro prci s etzci, protoe procedura FSplit
vbec nezkoum adres disku a nekontroluje, zda soubor, jeho
jmno dl, existuje nebo vbec existovat me. Prost jenom
rozdl podle njakch syntaktickch pravidel jeden etzec na
ti. Pokud vstupn etzec nevyhovuje pravidlm pro zpis jmen
soubor pokus se procedura pesto njak jej rozdlit, ale
nastav promnnou DosError na nenulovou hodnotu.

5.4.9. Zjitn aktivnho adrese

Ŀ
  procedure GetDir ( d : byte; var s : string );            


zjiuje kter adres je na zadanm disku aktivn. Disk se
zadv jako prvn parametr a to zpsobem, kter byl popsn v
odstavci o funkci DiskFree. Druh parametr je vstupn a
procedura do nho ulo jmno adrese.

5.4.10. Zjitn atribut souboru

Ŀ
  procedure GetFAttr ( var F; var Attr : word );    { Dos } 


   Prvnm parametrem procedury je logick soubor libovolnho
typu (soubor zznam, Text, primitivn soubor). Druh parametr
je vstupn a procedura do nho ulo atributy souboru kdovan
tak, jak bylo uvedeno u popisu procedur FindFirst a FindNext.

5.4.11. Zjitn data a asu posledn zmny v souboru

Ŀ
  procedure GetFTime ( var F; var Time : longint ); {Dos}   


   Prvnm parametrem procedury je logick soubor libovolnho
typu (soubor zznam, Text, primitivn soubor). Druh parametr
je vstupn a procedura do nho ulo as a datum, kdy byl
soubor zaloen (opraven).
   Datum a as jsou kdovny podle pravidel, kter stanov
DOS,pro pevod do itelnho tvaru slou procedura

Ŀ
  procedure UnpackTime(Time:longint;var T:DateTime); {Dos}  


kter Longint pevede na strukturu
   Type  DateTime = record 
                      Year,Month,Day,Hour,
                      Min,Sec: word;
                    end;
kter je deklarovna v unit Dos.

5.4.12. Vytvoen adrese na disku

Ŀ
  procedure MkDir ( s : string );                           


   Vytvo adres DOSu na disku. Parametrem je etzec a
plat pro nj stejn pravidla jako pro parametr DOSovskho
pkazu MKDIR.

5.4.13. Pejmenovn souboru

Ŀ
  procedure Rename ( var F; Newname : string );             


   Pejmenuje vnj diskov soubor. Prvnm parametrem procedury
je logick soubor libovolnho typu (soubor zznam, Text,
primitivn soubor), kter nesm bt oteven, ale mus mu bt
procedurou Assign piazen vnj soubor.

5.4.14. Zruen adrese na disku

Ŀ
  procedure RmDir ( s : string );                           


   Smae adres zadan parametrem procedury. Nesm to bt
aktivn adres a mus bt przdn. V opanm ppad systm
ohls chybu.

5.4.15. Nastaven atribut souboru

Ŀ
  procedure SetFAttr ( var F; Attr : word ); { Dos }        


   Nastav atributy fyzickho diskovho souboru. Prvnm
parametrem procedury je logick soubor libovolnho typu (soubor
zznam, Text, primitivn soubor) kter je piazen pslunmu
vnjmu souboru. Druh parametr obsahuje atributy souboru
kdovan tak, jak bylo uvedeno u popisu procedur FindFirst a
FindNext.

5.4.16. Nastaven data a asu posledn zmny v souboru

Ŀ
  procedure SetFTime ( var F; Time : longint ); { Dos }     


   Prvnm parametrem procedury je logick soubor libovolnho
typu (soubor zznam, Text, primitivn soubor). Druh obsahuje
as a datum, kter m bt do adrese DOSu uloeno jako as
a datum, kdy byl soubor zaloen (opraven). Datum a as jsou
kdovny, pro pevod z itelnho tvaru slou procedura 
PackTime, kter strukturu DateTime (viz odstavec o procedue 
GetFTime) pevede na Longint.
   Procedura PackTime je v UNITu Dos deklarovna jako

Ŀ
 procedure PackTime ( var T:DateTime;var Time:longint);     


5.4.17. Zkrcen souboru

Ŀ
  procedure Truncate ( var F );                             


   Zkrt soubor na aktivn pozici. Parametrem procedury je
logick soubor libovolnho typu, kter mus bt oteven.
Procedura smae vechny zznamy, kter nsleduj za aktivnm a
Eof se nastav na TRUE.


5.5. Oeten chyb vstupnch a vstupnch operac

   Za normlnch okolnost oetuje Pure Pascal vskyt chyb
pi provdn vstupnch a vstupnch operac tak, e zastav
bh programu a na obrazovku monitoru nape pslun chybov
hlen. To vak nevyhovuje pro tvorbu uivatelsky orientovanch
aplikac, kter mus poskytovat obsluze urit komfort, do
kterho se dnes vtinou zapotv i to, e pota vechna
hlen pe v eskm jazyce. Ale i jindy me bt vhodnj,
aby chyba V/V operace nezastavila bh programu, ale aby byla
jen njakm zpsobem signalizovna. Na samotnm programu pak je,
jak se s touto situac vypod a jak chybu oet. 

   Pure Pascal takov uivatelsk oeten V/V chyb umouje.
Slou k tomu:
   Direktiva {$I+}, kter informuje peklada o tom, e m
sestavit program tak, e vskyt chyby pi provdn V/V operac
zpsob zastaven systmu a vypsn chybov hlky. 
  Analogicky direktiva {$I-}, kter informuje peklada o tom,
e m sestavit program tak, e vskyt chyby pi provdn V/V
operac nezpsob zastaven systmu a vypsn chybov hlky,
ale jen naplnn pslun systmov promnn kdem chyby.
Funkce

Ŀ
  function IOResult : word;                                 


vrac kd chyby posledn proveden V/V operace.

   Psobnost direktiv {$I+} a {$I-} zan operac, kter
nsleduje bezprostedn za nimi a kon pi vskytu direktivy
opan nebo koncem programu. Implicitn hodnota je {$I+}.

   Funkce IOResult vrac kd chyby, kter jinak nape
standardn hlka systmu pi chybovm zastaven programu. Pokud
V/V operace dopadla spn, vrac nulu.
   Volnm funkce IOResult se systmov promnn, kter obsahuje
kd chyby vynuluje, take pi dvojm voln tto funkce
bezprostedn za sebou, vrt jej druh voln vdy nulu.

   Pkladem je procedura, kter oteve textov soubor pro
doplovn, pokud existuje a pro zpis v opanm ppad.

 uses Dos;
 procedure Open( var F : Text; Name : String );
    begin
       Assign(F,Name);
       {$I-}
       Append(F);
       if IOResult > 0 then Rewrite(F);
       if IOResult > 0 then
            begin
            Writeln('Soubor nejde otevt!');
            Halt;  { Konec }
            end;
       {$I+}
    end;

   Jako druh pklad uvedeme proceduru, kter vrt TRUE, kdy
disketa v drivu A: je pipravena k zpisu a vrt FALSE jinak.
Napklad tehdy, kdy disketa v drivu vbec nen.

    uses Dos;
    function ReadyA : boolean;
    var F : Text;
    begin
       {$I-}
       Assign(F,'A:\XXX.XXX');
       Rewrite(F);
       ReadyA := (IOResult = 0);
       {$I+}
    end;

   V souvislosti s oetenm V/V chyb si prostudujte dodatek 
B.2 a kapitolu 7.4 v druhm dlu skript.


5.6. Primitivn soubory a prce s buffery

5.6.1. Buffery soubor

   Hned na zatku cel kapitoly o souborech jsme si ekli, e
prostednictvm soubor pistupujeme k cel ad zazen,
kter jsou velmi rznorodho charakteru. Jedno vak maj tm
bez vyjmky spolen. Jsou pomal. Z hlediska procesoru dokonce
nesnesiteln pomal. Kdyby si musel procesor na zazen chodit
pro kad byte zvl,nedlal by v podstat nic jinho, ne
ekal a ekal a ekal...

   Ne budeme mt k dispozici disky, kter budou tak rychl, e
nebudou procesor vbec zdrovat, tak si jet pokme, ale do
t doby se musme snait zrychlit pstup do soubor programov.
Zkladnm eenm je nast vdy vce daj najednou do pamti a
pak si tam pro n chodit. To jde rychle.
  Potebujeme tedy pro kad soubor st pamti, kter nm 
bude slouit jako pekladit dat. k se j vyrovnvac pam
neboli buffer. 

   Prvn problm, nad kterm se musme zamyslet, je otzka
velikosti bufferu. Je asi zejm, e m je buffer vt, tm
rychlej bude pstup do souboru, protoe nebude teba tak
asto komunikovat s loudavm mechanismem. Bylo by ale jist
dobr, aby kad soubor ml svj vlastn buffer, aby bylo mono
efektivn pracovat s vce soubory najednou. A bude taky dobr,
kdy nm zbyde njak pamt pro program.

   Vtinou se o otzku buffer pro soubory nemusme vbec
starat. Pure Pascal to ve spojen s DOSem vye uspokojiv
za ns. V nkterch situacch si ale musme na buffery dt
pozor. Souvis s nimi toti napklad otzka bezpenosti dat.
Data uloen na disku jsou uloen vtinou dosti bezpen. Na
druhou stranu naopak data kter jsme sice ji zapsali (eknme
procedurou Write), ale kter jsou zatm jenom v bufferu a na
disk jet neodela, jsou dost zraniteln. Pete-li napklad
njak databzov program, ml by bt bezpen, tedy napklad
vpadek elektrick st by neml znamenat pohromu, kter bude
mt za nsledek velk kody v datech.

5.6.2. Buffery textovch soubor

  Nejprve se jet vrtme k textovm souborm a ukeme si,
jak meme definovat buffer a jeho velikost. Slou nm k tomu
procedura

Ŀ
 procedure SetTextBuf (var F:Text;var Buf [;size:word]);    


  Parametry procedury jsou textov soubor, dle netypovan
promnn Buf a Size, co je vraz typu word.
  Promnn Buf je n vlastn buffer, co znamen, e pi ten
nebo zpisu (Read, Write) do textovho souboru se data ukldaj
do pamti obsazen promnnou Buf. Size specifikuje velikost
bufferu v bytech, chyb-li, pedpokld se velikost SizeOf(Buf).
  Implicitn velikost bufferu (tj. pracujeme-li s textovmi
soubory bez pouit tto procedury) je 128 B. Zpis do fyzickho
souboru se dje prostednictvm bufferu DOSu. Velikost
bufferu v DOSu je pro diskov soubory 512 B a je ji mono
zmnit pouitm pslunho peruen, pesn postup viz
[HRYCEJ].
  Doporuen velikost bufferu je 512 B, tj. velikost
odpovdajc velikosti bufferu v DOSu.
  Buffer by se ml mnit pouze u jet neotevenho souboru (po
Assign), zmna bufferu u otevenho souboru me zpsobit ztrtu
dat.
Pklad:
  var F : Text;
    c : char;
    Buf : array [1..10000] of char;
  begin 
   Assign(F,'a:F.TXT');
   SetTextBuf(F,Buf);  { Velikost je SizeOf(Buf) }
   Reset(F);
   while not Eof(F) do
     begin
     Read(F,c);
     Writeln(c);
     end;
   Close(F);
  end;

  S pedchoz procedurou zce souvis procedura

Ŀ
 procedure Flush ( var F : Text );                          


  Tato procedura ulo obsah vyrovnvac pamti do textovho
souboru otevenho pro zpis (Append, Rewrite). Tmto zpsobem
meme zajistit uloen dat do fyzickho souboru.
  Pokud probhne uloen spn, vrac IOResult 0, jinak
nenulov slo (samozejm pi nastaven {$I-}).

5.6.3. Primitivn soubory a buffery

  O primitivnch souborech jsme se u zmiovali. Slou pro
pstup k souborm bez ohledu na jejich strukturu. Deklarace je
velice jednoduch : 
  var F : file;
  Zdraznme, e primitivn soubory jsou vdy diskov soubory s
pmm pstupem.
  Procedura Assign se pouv stejn jako u ostatnch typ
soubor. U procedur pro oteven souboru je mal odlinost.
Meme toti definovat velikost zznamu, s nm se bude
pracovat.

Ŀ
 procedure Reset ( var F : file [; RecSize : word] );       


Ŀ
 procedure Rewrite ( var F : file [; RecSize : word] );     


  Pro oteven souboru plat stejn pravidla jako pro soubory
zznam s pmm pstupem. Reset otevr existujc soubor,
Rewrite neexistujc soubor, resp. existujc soubor smae a
oteve jej jako przdn.
  Nyn se budeme vnovat parametru RecSize. Tento parametr
uruje velikost zznamu uvanho pro penos dat. Nen-li
uveden, pedpokld se velikost 128 B. Doporuovan velikost je
vak 1. Jestlie toti velikost souboru nen dliteln zadanou
velikost zznamu, me pi ten dojt k problmm v okamiku,
kdy budeme st posledn (nepln) zznam souboru. Jeliko 
velikost kadho souboru je dliteln slem 1, je zpravidla
nejlep uvdt ji jako hodnotu parametru RecSize.

  Pro ten z primitivnch soubor slou procedura BlockRead.
Tuto proceduru nememe pout pro jin typy soubor, a naopak
pro primitivn soubory nelze pout proceduru Read nebo Readln.

Ŀ
 procedure BlockRead(var F:File;var B;C:word[;var R:word]); 


  Soubor F mus bt oteven. Procedura nate ze souboru F do
pamti (na msto, kde zan buffer B) C nebo mn zznam.
Poet skuten petench zznam je uloen do vstupnho
parametru R. Nen-li uveden R, me dojt k chyb, kdy poet
petench zznam se nerovn C.
  Zpracovvan blok zabr C*RecSize, kde RecSize je velikost
uren pi oteven souboru. Samozejm, e velikost bloku mus
bt men ne 65520 B.
  Pi spnm ten bloku je R rovno C, tedy poadovanmu
potu natench zznam. Me se vak stt, e konec souboru je
indikovn dve, ne je peteno C zznam. Pak je ovem v R
vrcen poet skuten petench zznam.
  Situace, kdy R se nerovn C, signalizuje konec souboru.

Ŀ
 procedure BlockWrite(var F:File;var B;C:word[;var R:word]); 


  Tato procedura pracuje obdobn jako pedchoz. Tentokrt ale
zapisujeme do souboru. F tedy mus bt oteven, piem lze
specifikovat velikost zznamu. V parametru R je uloen poet
skuten zapsanch zznam. B je opt vyrovnvac pam, ukld
se do n C*RecSize byt, pozor na pekroen 65520 byt.
  Parametr R opt nen povinn, ale me dojt k chyb, pokud
nen uveden.
  Pouit obou procedur a specifikaci vyrovnvac pamti si
ukeme na pkladu:

  var 
     F,G : file; 
     Result : word; 
     Buf : array [1..1000] of char; 
  begin 
     assign(F,'A:F.TXT'); 
     reset(F,1);     { velikost zznamu je 1 }
     assign(G,'A:G.TXT'); 
     rewrite(G,1);     {     "       "       1 }
     while not eof(F) do 
        begin 
       BlockRead(F,Buf,SizeOf(Buf),Result); 
        BlockWrite(G,Buf,Result,Result); 
       end; 
     close(F); 
     close(G); 
  end. 

  Pedpokldejme, e soubor F.TXT m velikost 2893 byt. Cyklus
probhne dvakrt, v promnn Result je 1000, pi poslednm
prchodu je v Result 893. Proto tak v procedue BlockWrite
uvdme na tetm mst Result, abychom zajistili zpis vech
znak ze souboru F.
  Odlin situace nastane, kdybychom oteveli oba soubory bez
uveden RecSize, ili by se uvaovala implicitn hodnota 128
Kb, a v BlockRead bychom uvedli poet zznam SizeOf(Buf) div
128. Po prvnm prchodu cyklem bude Result=7 a zape se 
7*128=896 byt, v dalch dvou prbzch tak, pi poslednm
prchodu cyklem se zape jedin zznam, celkem tedy 2816 byt.
Z toho plyne, e zbytek souboru se nepepe do souboru G.

  Poznamenejme, e primitivn soubory je tak mono pouvat
jako parametry nkterch standardnch podprogram uvedench v
odstavci 5.4.

  Otzky a cvien

 1. Podle jakch kritri dlme soubory?
 2. Co to jsou sekvenn soubory?
 3. Jak je rozdl mezi sekvennmi soubory a soubory zznam?
 4. Jak znte vstupn a vstupn zazen?
 5. Co jsou soubory s pmm pstupem?
 6. Co jsou primitivn soubory?
 7. Popite prci procedur Assign, Reset, Rewrite a Close.
 8. Popite procedury Read a Write.
 9. Co je Eof?
10. Kdy pouijete funkce FilePos, Seek a FileSize?
11. Popite prci s textovmi soubory.
12. m se odliuj textov a primitivn soubory?
13. Je njak rozdl mezi textovm souborem a souborem file of  
    char?
14. Existuje pro textov soubory vyrovnvac pam?
15. Kde se setkte s procedurami BlockRead a BlockWrite?
16. Popite nkter procedury pro prci s diskovmi soubory.
ZVR

  V prvnm dlu jsme se seznmili se zkladnmi prostedky pro
prci v Pure Pascalu. Ve druhm dlu ns ek prce s
dynamickmi promnnmi, objekty, unitami; spoluprce s DOSem.
Konec druhho dlu vnujeme prci s unitou CRT (umoujc
nestandardn operace s periferiemi) a unitou GRAPH (obsahujc
procedury pro grafick vstupy na monitor).

  Vtina popsanch prvk je dosti obtn a pouvaj ji pouze
zkuenj programtoi. Unita CRT vak obsahuje nkolik
elementrnch procedur, k jejich pochopen nen teba
rozshlho studia, a proto se o nich ve strunosti zmnme ji
nyn.

  Pouvte-li libovolnou z uvedench procedur, muste do
seznamu uses zapsat CRT. Tak tedy:

  asova

Ŀ
 procedure Delay ( MiliSec : word );                        

  Pozastav vpoet na dobu MiliSec (v milisekundch).

  Monitor

Ŀ
 procedure ClrScr;                                          

  Smae obrazovku, tj. obarv ji aktuln barvou pozad.

Ŀ
 procedure GotoXY ( X, Y : byte );                          

  Nastav kurzor na pozici [x,y], piem x=1..80 (sloupec) a
y=1..25 (dek).

Ŀ
 procedure TextColor ( Color : byte );                      

  Definuje barvu psma. Barvy mohou bt v rozsahu 0..15.

Ŀ
 procedure TextBackground ( Color : byte );                 

  Definuje barvu pozad. Barva me bt v rozsahu 0..7.

Oznaen jednotlivch barev je nsledujc:
  0=ern      4=erven      8=tmaved    12=sv.erven
  1=modr      5=fialov      9=svtlemodr  13=sv.fialov
  2=zelen     6=hnd       10=sv. zelen   14=lut
  3=bledmodr 7=svtleed  11=sv.bl.modr  15=bl

  Reproduktor

Ŀ
 procedure Sound ( Frekvence : word );                      

  Zapne reproduktor na specifikovan frekvenci.

Ŀ
 procedure NoSound;                                         

  Vypne reproduktor.

  Klvesnice

Ŀ
 function ReadKey : Char;                                   

  Vrt znak, kter byl stisknut na klvesnici a nebyl dosud
zpracovn. Pokud dn takov nen, ek, ne bude nkter
klvesa stisknuta. Byla-li stisknuta klvesa, kter neodpovd
dnmu znaku v ASCII tabulce, vyd funkce ReadKey znak #0 a
pi jejm druhm voln vrt pslun extended kd znaku (viz
dodatek A).

Ŀ
 function KeyPressed : boolean;                             

  Vrac true, pokud byla zmknuta nkter klvesa, kter nebyla
dosud zpracovna funkc ReadKey.

Pklad:
program CtiCislo;
var
  c:char;
  s:word;
begin
  while KeyPressed do c:=Readkey;   { Pesko vechny dosud }
                    { zadan znaky        }
  s:=0;
  repeat
   c:=Readkey;
   if (c>='0') and (c<='9') then
     begin
     s:= s*10 + ord(c)-ord('0'); { Akceptuje slici      }
     write(c);
     end;
   if c=0 {Extended znak} then 
     if Readkey=#83 {Delete} then c:=#8 else c:=#0;
   if c=#8 {Backspace} then
     begin
     s:=s div 10;       { Smae posledn slici }
     write(#8);
     end;
   if c=#27 {Esc} then
     begin
     s:=0;             { slo vynuluje         }
     c:=13;
     end;
  until c=13;            { Prci ukon na ENTER  }
  if KeyPressed then c:=Readkey;    { Pesko ppadn LF   }
  writeln('----->',s,'<-----');
end.A. ASCII tabulka

  Pi prci s funkc READKEY a pi vpisu znak na monitor nebo
na tiskrnu se obvykle neobejdeme bez ASCII tabulky o n jsme
ji hovoili.

  V jednotlivch sloupcch jsou postupn uvedeny: slo
dekadicky a hexadecimln, znak, jak je zobrazovn na monitoru a
jak je ten z klvesnice, znak, jak je ten z klvesnice funkc
READKEY, pokud ped tm vydala nulu a konen vznam uvedenho
kdu pro tiskrnu.

                       st 1.
ͻ
  slo Chr  Extended  PRN  slo Chr  Extended  PRN
Ķ
   0 00  *             NUL  32 20       Alt D       
   1 01  *                  33 21  !    Alt F       
   2 02  *     NUL          34 22  "    Alt G       
   3 03  *                  35 23  #    Alt H       
   4 04  *                  36 24  $    Alt J       
   5 05  *                  37 25  %    Alt K       
   6 06  *                  38 26  &    Alt L       
   7 07  **            BEL  39 27  '                
   8 08  **                40 28  (                
   9 09  *                  41 29  )                
  10 0A  **            LF   42 2A  *                
  11 0B  *             TAB  43 2B  +                
  12 0C  *             FF   44 2C  ,    Alt Z       
  13 0D  **            CR   45 2D  -    Alt X       
  14 0E  *             Spr  46 2E  .    Alt C       
  15 0F  *  Shift TAB  Sko  47 2F  /    Alt V       
  16 10  *    Alt Q         48 30  0    Alt B       
  17 11  *    Alt W         49 31  1    Alt N       
  18 12  *    Alt E    Eko  50 32  2    Alt M       
  19 13  *    Alt R         51 33  3                
  20 14  *    Alt T    Epr  52 34  4                
  21 15  *    Alt Y        53 35  5                
  22 16  *    Alt U         54 36  6                
  23 17  *    Alt I         55 37  7                
  24 18  *    Alt O    CAN  56 38  8                
  25 19  *    Alt P         57 39  9                
  26 1A  **            EOF  58 3A  :                
  27 1B  *             ESC  59 3B  ;      F1        
  28 1C  *                  60 3C  <      F2        
  29 1D  *                  61 3D  =      F3        
  30 1E  *    Alt A         62 3E  >      F4        
  31 1F  *    Alt S         63 3F  ?      F5        
ͼ

  Hodnoty uveden ve sloupci Chr jsou zobraziteln na monitoru
s vjimkou tch, kter jsou oznaeny dvma hvzdikami, tyto
znaky se projev jako: 7 = BEL (ppnut), 8 = BACKSPASCE (je
smazn pedchoz znak na monitoru a kurzor se nastav na tuto
pozici), 10 = LF (posun o dku vped), 13 = CR (nastaven
kurzoru na prvn sloupec aktuln dky).

                       st 2.
ͻ
  slo Chr  Extended  PRN  slo Chr  Extended  PRN
Ķ
  64 40  @      F6          96 60  `    Ctrl F3     
  65 41  A      F7          97 61  a    Ctrl F4     
  66 42  B      F8          98 62  b    Ctrl F5     
  67 43  C      F9          99 63  c    Ctrl F6     
  68 44  D      F10        100 64  d    Ctrl F7     
  69 45  E                 101 65  e    Ctrl F8     
  70 46  F                 102 66  f    Ctrl F9     
  71 47  G     Home        103 67  g    Ctrl F10    
  72 48  H      Up         104 68  h    Alt F1      
  73 49  I     PgUp        105 69  i    Alt F2      
  74 4A  J                 106 6A  j    Alt F3      
  75 4B  K     Left        107 6B  k    Alt F4      
  76 4C  L    Center       108 6C  l    Alt F5      
  77 4D  M     Right       109 6D  m    ALt F6      
  78 4E  N                 110 6E  n    Alt F7      
  79 4F  O     End         111 6F  o    Alt F8      
  80 50  P     Down        112 70  p    Alt F9      
  81 51  Q     PgDn        113 71  q    Alt F10     
  82 52  R    Insert       114 72  r  Ctrl Print    
  83 53  S    Delete       115 73  s  Ctrl Left     
  84 54  T   Shift F1      116 74  t  Ctrl Right    
  85 55  U   Shift F2      117 75  u  Ctrl End      
  86 56  V   Shift F3      118 76  v  Ctrl PgDn     
  87 57  W   Shift F4      119 77  w  Ctrl Home     
  88 58  X   Shift F5      120 78  x    Alt 1       
  89 59  Y   Shift F6      121 79  y    Alt 2       
  90 5A  Z   Shift F7      122 7A  z    Alt 3       
  91 5B  [   Shift F8      123 7B  {    Alt 4       
  92 5C  \   Shift F9      124 7C  |    Alt 5       
  93 5D  ]   Shift F10     125 7D  }    Alt 6       
  94 5E  ^    Ctrl F1      126 7E  ~    Alt 7       
  95 5F  _    Ctrl F2      127 7F      Alt 8       
ͼ

  Zvltn roli zde hraje kd 26 = EOF (konec souboru), kter
lze pmo zobrazit, pokud vstup provdte pmo pomoc write,
jakmile jde o vstup do textovho souboru (viz AssignCrt), je
chpn jako konec souboru a zobrazeno ji nen nic.
  Pi vstupu pomoc READKEY jsou samozejm pouiteln pouze ty
znaky, kter lze z klvesnice zmknout. Pamatujme si, e pro
tento el je: BACKSPACE = 8, TAB = 9, Ctrl ENTER = 10, ENTER =
13 + 10, ESC = 27; podobn, jako je to u tisk.
  Pro tiskrnu plat, e jednotliv znaky jsou zobraziteln
podle Chr, nen-li uvedeno jinak v sloupeku PRN. Vznam tchto
hodnot je zapsn v pslun pruce pro Vai tiskrnu. Zde
jen orientan:
- BEL, BACKSPACE, CR, LF, TAB m stejn vznam jako na monitoru.
- FF = pechod na novou strnku;    CAN = smazn napsan dky.
- Sxx = zatek, Exx = konec:
        pr = proloenho tisku, ko = komprimovanho tisku.

                       st 3.
ͻ
  slo Chr  Extended  PRN  slo Chr  Extended  PRN
Ķ
 128 80      Alt 9        160 A0                  
 129 81      Alt 0        161 A1                  
 130 82      Alt -        162 A2                  
 131 83      Alt =        163 A3                  
 132 84    Ctrl PgUp      164 A4                  
 133 85       F11         165 A5                  
 134 86       F12         166 A6                  
 135 87    Shift F11      167 A7                  
 136 88    Shift F12      168 A8                  
 137 89     Ctrl F11      169 A9                  
 138 8A     Ctrl F12      170 AA                  
 139 8B      Alt F11      171 AB                  
 140 8C      Alt F12      172 AC                  
 141 8D                   173 AD                  
 142 8E                   174 AE                  
 143 8F                   175 AF                  
 144 90                   176 B0                  
 145 91                   177 B1                  
 146 92                   178 B2                  
 147 93                   179 B3                  
 148 94                   180 B4                  
 149 95                   181 B5                  
 150 96                   182 B6                  
 151 97                   183 B7                  
 152 98                   184 B8                  
 153 99                   185 B9                  
 154 9A                   186 BA                  
 155 9B                   187 BB                  
 156 9C                   188 BC                  
 157 9D                   189 BD                  
 158 9E                   190 BE                  
 159 9F                   191 BF                  
ͼ

  Znaky od 128 do 173 jsou ve standardu vnovny mezinrodn
abeced. V echch se obvykle nepouv a msto n se zavd
jin sady, jako je tomu i v naem ppad, kdy jsme do tabulky
zapsali "etinu podle bratr Kamenickch", kter je pro
spoluprci s Pure Pascalem vyhovujc. Mnoho programtor
pouv na osobnch potach jin verze etin, zejmna LATIN
II. Tato sada pekrv kdy 64 a 127. Ob verze vyaduj pro
pouit speciln ovladae (drivers) pro klvesnici, monitor a
tiskrnu, kter je poteba jet ped prac s Pure Pascalem do
systmu zavst.

  Editor integrovanho systmu je osmibitov, tj. je schopen
reprezentovat i znaky z nrodn abecedy a znaky semigrafick.
Tyto znaky lze pst i pomoc ALT klvesy tak, e stisknete
klvesu ALT a na prav (numerick) sti klvesnice vypete
kd znaku, kter chcete zobrazit (nap. do konstanty typu
etzec), nyn klvesu ALT uvolnte.
                      st 4.
ͻ
  slo Chr  Extended  PRN  slo Chr  Extended  PRN
Ķ
 192 C0                   224 E0                  
 193 C1                   225 E1                  
 194 C2                   226 E2                  
 195 C3                   227 E3                  
 196 C4                   228 E4                  
 197 C5                   229 E5                  
 198 C6                   230 E6                  
 199 C7                   231 E7                  
 200 C8                   232 E8                  
 201 C9                   233 E9                  
 202 CA                   234 EA                  
 203 CB                   235 EB                  
 204 CC                   236 EC                  
 205 CD                   237 ED                  
 206 CE                   238 EE                  
 207 CF                   239 EF                  
 208 D0                   240 F0                  
 209 D1                   241 F1                  
 210 D2                   242 F2                  
 211 D3                   243 F3                  
 212 D4                   244 F4                  
 213 D5                   245 F5                  
 214 D6                   246 F6                  
 215 D7                   247 F7                  
 216 D8                   248 F8                  
 217 D9                   249 F9                  
 218 DA                   250 FA                  
 219 DB                   251 FB                  
 220 DC                   252 FC                  
 221 DD                   253 FD                  
 222 DE                   254 FE                  
 223 DF                   255 FF  *                
ͼ

  Znaky oznaen hvzdikou nen mon vytisknout, protoe to
jsou dc znaky pro tiskrnu. B. Chybov hlen

  Pi prci s Pure Pascalem se nevyhneme chybm. Abychom je
mohli odstraovat, musme znt jejich pinu. V tomto dodatku
uvdme seznam chybovch hlen pi pekladu a pi bhu (vetn
chyb pi prci s unitami Dos, Overlay a Graph). Vtina z nich
nen komentovna, nebo jejich pina je zejm ji z vznamu
anglickho hlen. Ty chyby, kter mohou mt vce pin nebo
jsou sloitj, obsahuj strunou npovdu k jejmu odstrann.



1. Chyby pi pekladu nebo pi prci s integrovanm systmem

  Tyto chyby se vyskytuj pouze v integrovanm systmu jako
hlen ve stavovm dku editorovho okna.


  1 Out of memory
    - Nastavte Compile = Disk a Link = Disk.
    - Odstrate rezidentn programy (obvykle Reset).
    - Kd pesahuje 64KB, pouijte TPC.exe.
  2 Identifier expected
  3 Unknown identifier
  4 Duplicate identifier
  5 Syntax error
  6 Error in real constant
  7 Error in integer constant
  8 String constant exceeds line
  9 Too many nested files    (max 4)
 10 Unexpected end of file
 11 Line too long         (max 126) 
 12 Type identifier expected
 13 Too many open files       (max 15)
    - Do Config.sys ulote FILES=20.
 14 Invalid file name
 15 File not found
 16 Disk full
 17 Invalid compiler directive
 18 Too many files
    - Pli mnoho INCLUDE soubor.
 19 Undefined type in pointer definition
 20 Variable identifier expected
 21 Error in type
 22 Structure too large       (max 64KB)
 23 Set base type out of range     (0..255)
 24 File components may not be files or objects
 25 Invalid string length          (1..255)
 26 Type mismatch
 27 Invalid subrange base type
 28 Lower bound greater than upper bound
 29 Ordinal type expected
 30 Integer constant expected
 31 Constant expected
 32 Integer or real constant expected
 33 Type identifier expected
 34 Invalid function result type
 35 Label identifier expected
 36 BEGIN expected
 37 END expected
 38 Integer expression expected
 39 Ordinal expression expected
 40 Boolean expression expected
 41 Operand types do not match operator
 42 Error in expression
 43 Illegal assignment
 44 Field identifier expected
 45 Object file too large    (max 64KB)
 46 Undefined external
   - Provte popis PUBLIC u podprogramu v OBJ-souboru.
   - Provte korektn specifikaci vech .OBJ v {$L ...}.
 47 Invalid object file record
   - .OBJ soubor nem pedepsan tvar.
 48 Code segment too large    (max 64KB)
 49 Data segment too large    (max 64KB)
 50 DO expected
 51 Invalid PUBLIC definition
   - PUBLIC identifiktor nem odpovdajc external v Pascalu.
   - Dvakrt definovan tent PUBLIC.
   - PUBLIC definovan mimo CODE segment.
 52 Invalid EXTERN definition
   - Promnn nen definovna nebo je absolute nebo inline.
 53 Too many EXTRN definitions (max 256)
 54 OF expected
 55 INTERFACE expected
 56 Invalid relocatable reference
   - Program uloen mimo CODE segment.
   - Pouit nedovolenho odkazu na relokabiln symboly.
   - Odkaz na symbol mimo CODE nebo DATA segment.
   - Podprogram volan s offsetem, nap. CALL Proc + 16.
 57 THEN expected
 58 TO or DOWNTO expected
 59 Undefined forward
   - Podprogram popsan v interface nen popsn v
     implementation.
   - Podprogram popsan jako forward nem pslunou deklaraci.
 60 Too many procedures       (max 512)
   - Pesute podprogramy do unit.
 61 Invalid typecast
   - Petypovn typem odlin velikosti.
   - Na tomto mst neme bt petypovn.
 62 Division by zero
 63 Invalid file type
 64 Cannot Read or Write variables of this type
 65 Pointer variable expected
 66 String variable expected
 67 String expression expected
 68 Circular unit reference
   - Data spolen obma unitm pesute do unity tet.
 69 Unit name mismatch
   - Jmno souboru i unity mus bt stejn.
 70 Unit version mismatch
   - Nenalezen .PAS soubor k unit, jej .PPU je "star".
 71 Duplicate unit name
 72 Unit file format error
   - .PPU soubor nem pedepsan tvar.
 73 Implementation expected
 74 Constant and case types do not match
 75 Record variable expected
 76 Constant out fo range
 77 File variable expected
 78 Pointer expression expected
 79 Integer or real expression expected
 80 Label not within current block
 81 Label already defined
 82 Undefined label in preceding statement part
 83 Invalid @ argumen
 84 UNIT expected
 85 ";" expected
 86 ":" expected
 87 "," expected
 88 "(" expected
 89 ")" expected
 90 "=" expected
 91 ":=" expected
 92 "[" or "(." expected
 93 "]" or ".)" expected
 94 "." expected
 95 ".." expected
 96 Too many variables    (max 64KB pro Local i Global)
 97 Invalid FOR control variable
 98 Integer variable expected
 99 Files are not allowed here
100 String length mismatch
101 Invalid ordering of fields
102 String constant expected
103 Integer or real variable expected
104 Ordinal variable expected
105 INLINE error
   - "<" pouit s relokabilnm symbolem.
106 Character expression expected
107 Too many relocation items  (max 64KB)
    - Rozdlit program na vce proces spoutnch pomoc PRGC.
112 Case constant out of range (-32768..32767, pouze u 5.0)
113 Error in statement
114 Cannot call an interrupt procedure
116 Must be in 6888? mode to compile this
   - Nastavte {$N+}.
117 Target address not found
118 Include files are not allowed here
120 NIL expected
121 Invalid qualifier
   - Indexovn, tekov notace nebo dereference promnn
     nevhodnho typu.
122 Invalid variable reference
123 Too many symbols       (max 64KB)
    - Pekldejte s {$D-}.
    - Rozdlte deklaraci do vce unit.
124 Statement part too large  (max 24KB)
    - Rozdlte pkazovou st bloku na podprogramy.
126 Files must be var parameters
127 Too many conditional symbols
128 Misplaced conditional directive
129 ENDIF directive missing
130 Error in initial conditional defines
131 Header does not match previous definition
   - Hlavika v interface (resp. forward) a v deklaraci mus
     bt zcela stejn nebo nesm obsahovat dn parametry. 
132 Critical disk error
   - Kupte si nov disk.
   - Vlote poadovanou disketu.
133 Cannot evaluate this expression
134 Expression incorrectly terminated
135 Invalid format specifier
136 Invalid indirect reference
   - V absolute nebo inline je pouit identifiktor z jinho
     modulu.
137 Structured variables are not allowed here
138 Cannot evaluate without System unit
   - PURE.TPL nenalezen, nebo neobsahuje SYSTEM.PPU.
139 Cannot access this symbol
    - Symbol nen alokovn, nebo nen pouit v kdu programu.
140 Invalid floating-point operation
141 Cannot compile overlays to memory
142 Procedure or function variable expected
143 Invalid procedure or function reference
    - Nejastji chybjc {$F+}.
144 Cannot overlay this unit
    - Chybjc {$O+}.
147 Object type expected
148 Local object types are not allowed
149 VIRTUAL expected
150 Method identifier expected
151 Virtual constructors are not allowed
152 Constructor identifier expected
153 Destructor identifier expected
154 Fail only allowed within constructors



2. Bhov chyby

  Bhov chyby jsou chyby vznikl pi bhu programu. Tento
seznam chyb je mnohem dleitj neli chyby pi pekladu,
nebo pi bhu programu mimo integrovan systm je uvedeno pi
chyb pouze jej slo a ne chybov hlen. Tento seznam je
pouvn i pi detekci chyb pomoc IOResult (mimo Fatal errors),
DosExitCode,  RunError (u neuvedench chyb integrovan systm
hls "Runtime error"). Teoreticky se tento chybnk pouv i u
procedur Halt a Keep.

  st tohoto seznamu lze vyut i pro detekci chyb pi prci s
unitou DOS pomoc promnn DosError (pouze chyby 2, 3, 5, 6, 8,
10, 11, 18).
 DOS Errors

  Tyto chyby jsou vydvny pmo Dosem. Chyby uveden v
zvorkch nemohou vzniknout pi bhu programu (s vjimkou chyb u
DosError) a jsou zde uvedeny pouze pro plnost (mohou vzniknout
u inline nebo external procedur).

( 0 No error )
    - RunError neohls v integrovanm systmu chybu (mimo nj
      ano), ale vpoet peru.
  1 Invalid DOS function code
   - Nedovolen parametry pi voln MeSsDOS (resp. Intr($21)).
  2 File not found
  3 Path not found
  4 Too many open file
    - Vce ne 15 otevench soubor.
    - Nenastaveno FILES=20 v CONFIG.SYS.
  5 File access denied
    - Soubor je adres nebo Read Only.
    - Soubor nen oteven na ten/zpis.
    - Adres je pln (u Rewrite).
    - Soubor existuje (u Rename, MkDir).
    - Jmno obsahuje i driver (u MkDir).
    - Neexistujc, neprzdn nebo koenov adres (RmDir).
  6 Invalid file handle
( 7 Memory control block destroyed )
  8 Not enough memory
( 9 Invalid memory block address )
(10 Invalid environment )
(11 Invalid format )
 12 Invalid file access code
(13 Invalid data )
 15 Invalid drive number
 16 Cannot remove current directory
 17 Cannot rename across drives
(18 No more matching files )
   - Takov (resp. dal) soubor neexistuje (viz FindFirst,
     FindNext).

  I/O Errors

  Tyto chyby jsou generovny Pascalem pi chybch u vstupu a
vstupu. Lze je, stejn jako ostatn I/O chyby generovan Dosem,
potlait pomoc {$I-}.

100 Disk read error
    - READ() za koncem souboru.
101 Disk write error
    - Pln disk.
102 File not assigned
103 File not open
104 File not open for input
105 File not open for otput
106 Invalid numeric format
 Critical Errors

  Tyto chyby jsou generovny Dosem pi diskovch operacch (INT
24H a INT 25H).

150 Disk is write-protected
151 Unknown unit
152 Drive not ready
153 Unknown command
154 CRC error in data
155 Bad drive request structure length
156 Disk seek error
157 Unknown media type
158 Sector not found
159 Printer out of paper
160 Device write fault
161 Device read fault
162 Hardware failure

  Fatal Error

  Tyto chyby jsou generovny Pascalem a vdy kon bh programu.

200 Division by zero
201 Range check error
202 Stack overflow error
203 Heap overflow error
204 Invalid pointer operation
205 Floating point overflow
206 Floating point underflow
207 Invalid floating point operation
208 Overlay manager not instaled
209 Overlay file read error

  Ctrl Break

255 User break
   - Tento nvratov kd odpovd peruen programu uivatelem
     klvesou CtrlBreak (je-li CheckBreak=true).


3. Chyby pi Overlay

  Chyby pi Overlay jsou podrobn popsny v 6.5.4. Jsou
indikovny v promnn OvrResult. Jejich hodnoty mohou bt tyto:

   OvrOk = 0;      { Bez chyby }
   OvrError    = -1;  { Chyba v zen overlay }
   OvrNotFound = -2;  { Nenalezen soubor .OVR }
   OvrNoMemory = -3;  { Nedostatek pamti pro buffer }
   OvrIOError  = -4;  { I/O chyba u .OVR souboru }
   OvrNoEMeSsDriver = -5;   { Nen instalovno E}
   OvrNoEMeSsMemory = -6;   { Nedostatek pamti v E}

4. Chyby v grafice

  Chyby v grafice jsou podrobn popsny v 9.1.3. Jsou pstupn
pomoc funkce GraphResult a jejich text pomoc GraphErrorMsg.
Jde o tyto chyby:


  0 = grOK               No error
 -1 = grNoInitGraph      (BGI) graphics not installed
   - Nenalezen .BGI soubor.
 -2 = grNotDetected      Graphics hardware not detected
   - Adaptr vaeho monitoru nepodporuje grafiku.
 -3 = grFileNotFound     Device driver file not found ()
   - Nenalezen .BGI soubor.
 -4 = grInvalidDriver    Invalid device driver file ()
   - .BGI soubor nem pedepsan tvar.
 -5 = grNoLoadMem        Not enough memory to load driver
   - Nedostatek pamti na HEAP pro zaveden grafickho ovladae
     ( potebuje asi 10KB ).
 -6 = grNoScanMem        Out of memory in scan fill
 -7 = grNoFloadMem       Out of memory in flood fill
 -8 = grNotFound         Font file not found ()
   - Nenalezen .CHR soubor.
 -9 = grNoFontMem        Not enough memory to load font
   - Nedostatek pamti na HEAP pro zaveden fontu (pro Gothic
     8.5KB - nejvt peddefinovan font).
-10 = grInvalidMode      Invalid gr. mode for selected driver
   - Pouijte DetectGraph.
-11 = grError            Graphics error
-12 = grIOError          Graphics I/O error
-13 = grInvalidFont      Invalid font file ()
   - .CHR soubor nem pedepsan tvar.
-14 = grInvalidFontNum   Invalid font number
-15 = grInvalidDeviceNum Graphics error (-15)

Seznam pouit literatury


[AHO]  AHO,A.V.-HOPCROFT,J.E.-ULLMAN,J.D.: Data Structures and
       Algorithms, Addision-Wesley, 2.vyd., 1985, 427 s.

[ADA]  Jazyk programirovanija ADA, Finansy i statistika, Moskva,
       1.vyd., 1981, 190 s.

[ANDL]   ANDL,J.: Matematick statistika, SNTL a ALFA, Praha,
          2.vyd., 1985, 352 s.

[AM]   Aplikovan matematika, SNTL, Praha, 1.vyd., 2386 s.

[BORLAND 87A] BORLAND INTERNATIONAL: Pure Pascal 4.0, USA,
     1.vyd., 1987, 654 s.

[BORLAND 87B] BORLAND INTERNATIONAL: Pure Pascal, User's Guide
     Version 5.0, USA, 1.vyd., 1987, 1988, 331 s.

[BORLAND 88] BORLAND INTERNATIONAL: Pure Pascal 5.0, Reference
     Guide, USA,  1.vyd., 1988, 493 s.

[BORLAND 89] BORLAND INTERNATIONAL: Pure Pascal 5.5, USA,
     1.vyd., 1989, 118 s.

[HRYCEJ]  HRYCEJ,D.-MATYSKA,K.: Operan systm DOS, SPS
          VIDEOPRESS MON, Praha, 1.vyd., 212 s.

[HURT] HURT,J.: Simulan metody, SPN, Praha, 1.vyd., 163 s.

[IBM]  IBM: Disk Operating System Version 3.30

[JANKOVEC] JANKOVEC,K.-KAPAR,J.-ZMEK,P.: Programovac jazyk
     COBOL, SPN, Praha, 1.vyd., 1982, 201 s.

[JINOCH]  JINOCH,J.-MULLER,K.-VOGEL,J.: Programovn v jazyku
          Pascal, SNTL, Praha, 3.vyd., 1988, 328 s.

[JROVSK] JROVSK,V.: Osobn potae, pednka na MFF UK,
     1988

[JROVSK-konzultace] JROVSK,V.: konzultace

[KALB]   KALB,P.-STAR,P.: FORTRAN 4 - popis jazyka, Oborov
          informan stedisko pro OVT, Praha, 1.vyd., 1981, 
     136 s.

[KERNIGHAN] KERNIGHAN,B.W.-RITCHIE,D.M.: Programovac jazyk C,
     ALFA a SNTL, Praha, 2.vyd., 1989, 256 s.

[KRYL]    KRYL,R.: Programovn, pednka na MFF UK, 1981

[MADNICK] MADNICK,S.E.-DONOVAN,J.J.: Operan systmy, SNTL,    
     Praha, 2.vyd., 1983, 592 s.

[MALK]   MALK,M.: Simula 67

[MEJZLK] MEJZLK,L.: Textov procesor Word Perfect 4.2, SPS
     VIDEOPRESS MON, Praha, 1.vyd., 1988, 64 s.

[MINIHOFER] MINIHOFER,O.-KRATOCHVLOV,J.: Anglicko-esk slov 
nk vpoetn techniky, SNTL, Praha, 1.vyd., 1986, 496 s.

[PETERKA] PETERKA,J.: TPS, programov dokumentace, 1988, 100 s.

[RAICHL]  RAICHL,J.: Programovn v Algolu, ACADEMIA, Praha,
          3.vyd., 1977, 236 s.

[WICHMANN] WICHMANN,B.A.:Towards a Formal Specification of
          Floating Point, The Computer Journal, Vol. 32, 1989,
          No. 5, 432 - 436 s.

[WIRTH]   WIRTH,N.: Systematick programovanie, ALFA a SNTL,
          Bratislava, 1.vyd., 1981, 208 s.

[YOUNG]   YOUNG,S.J.: Programovac jazyky pro RT-aplikace, SNTL,
          Praha, 1.vyd., 1989, 340 s.


Seznam peddefinovanch procedur a funkc

function Abs ( x : <CisTyp> ) : <CisTyp>;                 
   (38)
function Odd ( x : <CisTyp> ) : boolean;                  
   (38)
function Sqr ( x : <CisTyp> ) : <CisTyp>;                 
   (38)
function Hi ( x : <CTyp> ) : byte;                        
   (38)
function Lo ( x : <CTyp> ) : byte;                        
   (39)
function Swap ( x : <CTyp> ) : <CTyp>;                    
   (39)
function Abs ( x : real ) : real;                         
   (43)
function Arctan ( x : real ) : real;                      
   (43)
function Cos ( x : real ) : real;                         
   (43)
function Exp ( x : real ) : real;                         
   (43)
function Frac ( x : real ) : real;                        
   (43)
function Int ( x : real ) : real;                         
   (43)
function Ln ( x : real ) : real;                          
   (43)
function Pi;                                              
   (43)
function Sin ( x : real ) : real;                         
   (43)
function Sqr ( x : real ) : real;                         
   (44)
function Sqrt ( x : real ) : real;                        
   (44)
function Round ( x : real ) : longint;                    
   (44)
function Trunc ( x : real ) : longint;                    
   (44)
function Chr ( x : byte ) : char;                         
   (46)
function UpCase ( ch : char ) : char;                     
   (46)
function Length ( s : string ) : integer;                 
   (48)
function Concat ( s ,... : string ) : string;             
   (48)
function Copy(s:string;Ind:integer;Count:integer):string; 
   (48)
function Pos ( Substr,s : string ) : byte;                
   (49)
procedure Delete(var s:string;Ind:integer;Count:integer); 
   (49)
procedure Insert(Source:string;var s:string;Ind:integer); 
   (49)
procedure Str ( x : width : decimals;var s : string );    
   (49)
procedure Val ( s : string; var v; var code : integer);   
   (51)
function Ofs ( x ) : word;
   (53)
function Seg ( x ) : word;                                
   (53)
function Ptr ( seg, ofs : word ) : pointer;               
   (53)
function Ord ( x : <OrdTyp> ) : longint;                  
   (57)
function Pred ( x : <OrdTyp> ) : <OrdTyp>;                
   (57)
function Succ ( x : <OrdTyp> ) : <OrdTyp>;                
   (57)
procedure Dec ( var x );                                  
   (58)
procedure Dec ( var x; n : longint );                     
   (58)
procedure Inc ( var x );                                  
   (58)
procedure Inc ( var x; n : longint);                      
   (58)
procedure Exit;                                           
   (108)
procedure Assign ( var F : <SZ>; Name : string);           
   (199)
procedure Rewrite ( var F : <SZ>);
   (200)
procedure Reset  ( var F : <SZ>);
   (200)
procedure Write ( var F : <SZ>; var a );
   (200)
procedure Write ( var F : <SZ>; var a1,... );
   (201)
procedure Read ( var F : <SZ>; var a1,... );
   (201)
function Eof ( var F : <SZ>) : boolean;
   (202)
procedure Close ( var F : <SZ>);                           
   (202)
function FilePos ( var F : <SZ>) : longint;
   (204)
procedure Seek ( var F : <SZ>; N : longint);
   (205)
function FileSize ( var F : <SZ>) : longint;
   (205)
procedure Rewrite ( var F : Text );                       
   (207)
procedure Reset ( var F : Text );                         
   (207)
procedure Append ( var F : Text );                        
   (207)
function Eof( var F : Text) : boolean;                    
   (208)
function SeekEof ( var F : Text) : Boolean;               
   (209)
function Eoln ( var F : Text) : boolean;                  
   (210)
function SeekEoln ( var F : Text) : boolean;              
   (210)
procedure Writeln ( var F : Text);                        
   (211)
procedure Readln ( var F : Text);                         
   (211)
procedure Write ( var F : Text; a1,... );                 
   (212)
procedure Writeln ( var F : Text; [a1,...] );             
   (215)
procedure Read ( var F : Text; var a1,... );              
   (215)
procedure Readln ( var F : Text; [var a1,...] );          
   (217)
procedure Close ( var F : Text);                          
   (217)
procedure Erase ( Var F );                                
   (220)
procedure ChDir ( s : string );               { Dos }     
   (220)
function DiskFree ( Drive: byte ) : longint;  { Dos }     
   (221)
function DiskSize ( Drive: byte ) : longint;  { Dos }     
   (221)
function FExpand ( Path: PathStr ) : PathStr; { Dos }     
   (221)
procedure FindFirst(P:string;A:word;var S:SearchRec);{Dos}
   (221)
procedure FindNext ( var S : SearchRec );     { Dos }     
   (222)
function FSearch (P:PathStr;DirList:string):PathStr;      
   (223)
procedure FSplit(P:PS;var D:DS;var N:NS;var E:ES);        
   (224)
procedure GetDir ( d : byte; var s : string );            
   (225)
procedure GetFAttr ( var F; var Attr : word );    { Dos } 
   (225)
procedure GetFTime ( var F; var Time : longint ); {Dos}   
   (225)
procedure UnpackTime(Time:longint;var T:DateTime); {Dos}  
   (226)
procedure MkDir ( s : string );                           
   (226)
procedure Rename ( var F; Newname : string );             
   (226)
procedure RmDir ( s : string );                           
   (226)
procedure SetFAttr ( var F; Attr : word ); { Dos }        
   (226)
procedure SetFTime ( var F; Time : longint ); { Dos }     
   (227)
procedure PackTime ( var T:DateTime;var Time:longint);     
   (227)
procedure Truncate ( var F );                             
   (227)
function IOResult : word;                                 
   (228)
procedure SetTextBuf (var F:Text;var Buf [;size:word]);
   (229)
procedure Flush ( var F : Text );
   (230)
procedure Reset ( var F : file [; RecSize : word] );
   (231)
procedure Rewrite ( var F : file [; RecSize : word] );
   (231)
procedure BlockRead(var F:File;var B;C:word[;var R:word]);
   (231)
procedure BlockWrite(var F:File;var B;C:word[;var R:word]);
   (231)
procedure Delay ( MiliSec : word );       
   (233)
procedure ClrScr;       
   (233)
procedure GotoXY ( X, Y : byte ); 
   (233)
procedure TextColor ( Color : byte ); 
   (233)
procedure TextBackground ( Color : byte );
   (233)
procedure Sound ( Frekvence : word );  
   (234)
procedure NoSound;                    
   (234)
function ReadKey : Char;            
   (234)
function KeyPressed : boolean;     
   (234)


Rejstk

.BGI  15
.CHR  16
.PRG  129
.PAS   19, 22, 129
.PCK  129
.PP  129
.PPL  129
.PPU  129
::=  36, 38
"^"   78
"@"   79
(array),   24
(record),   24
(set)   24
[]   79
{$I+}   227
{$I-}   227
{$N-}  214
$   38
$A  153
$B  154
$D  157
$DEFINE  161
$E  156
$ELSE  161
$ENDIF  161
$F  152
$I  152
$IFDEF  161
$IFNDEF  161
$IFOPT  161
$L  158
$M  160
$N  154
$O  153
$R  151
$S  151
$UNDEF  161
$V  153
*.*   22
<  80
<bzov typ>   65
<binrn opertor>  80
<blok>   29, 103
<case-varianta>   62, 92
<CASE>  91
<slice>   27
<slo>   29
<CR><LF>   206
<deklarace konstant>  33
<deklarace konstanty>  33
<deklarace nvt>  96
                               <deklarace parametr>   73, 103
                               <deklarace podprogramu>  103
                               <deklarace promnn>  32
                               <deklarace promnnch>  32
                               <deklarace typovan konstanty> 
                                   34
                               <deklarace typ>  31
                               <deklarace>  31
                               <domnov typ>   52
                               <element etzce>  48
                               <ENTER>   219
                               <FOR>  94
                               <formln parametry>   73, 103
                               <GOTO>  96
                               <hexadecimln slice>  29
                               <hexadecimln slo>  29
                               <hlavika destruktoru>  103
                               <hlavika funkce>  103
                               <hlavika konstruktoru>  103
                               <hlavika metody>   68
                               <hlavika procedury>  103
                               <id.  96
                               <id. funkce>  104
                               <id. nvt>  96
                               <id. ordinlnho typu>   55
                               <id. procedury>  103
                               <id. promnn>  78
                               <id.>,...  103
                               <identifiktor>   28
                               <IF>  91
                               <index>   60
                               <konstanta typu mnoina>   66
                               <konstanta typu object>   71
                               <konstanta typu pole>   60
                               <konstanta typu zznam>   64
                               <konstanta>  92
                               <konstantn vraz>  33
                               <literl typu adresa>   54
                               <literl typu char>   46
                               <literl typu real>  40
                               <literl typu string>   47
                               <literl>  34
                               <logick vraz>  91, 93
                               <neterminl>   26
                               <oddlova>  27
                               <oddlovae>   28
                               <ordinln  91
                               <oznaen typu>  31
                               <P. blok>  103
                               <pedek>   68
                               <piazovac pkaz>  86, 90
                               <pkaz s nvtm>  96
                               <pkaz>  77, 90
                               <pkaz>;...  93
                               <pstup k metod>   71
                               <pstup k poloce>   60, 65,
                                   71
<Parametr_Write>  213
<psmeno>   27
<popis ordinlnho typu>   55
<popis strukturovanho typu>  
   59
<popis typu etzec>   47
<popis typu object>   68
<popis typu podprogram>   73
<popis typu pole>   59
<popis typu soubor>   73
<popis typu ukazatel>   52
<popis typu zznam>   61
<popis typu>  31
<przdn pkaz>  90
<promnn>  78, 79, 86, 90, 94
<REPEAT>  93
<seznam metod>   68
<seznam poloek>   61
<skuten parametry>  104
<sloen pkaz>  90
<speciln symbol>   27
<typ interval>   56
<typ mnoina>   65
<typovan konstanta>  34
<unrn opertor>  79
<vtov typ>   55
<vraz typu zznam>  98
<vraz>  79, 80
<vraz>,...  104
<voln funkce>  104
<voln procedury>  104
<vyhrazen slovo>   28
<WHILE>  93
<WITH>  98
<znak>   27
65520   110
6888?  10, 114
Abeceda jazyka  27
Abs  38, 43
Adresa  52
dc pkazy  23
dc znaky  137
Aktivn zznam souboru  204
Aktuln dka programu  171
Aktuln adres  141
Aktuln vraz  176
Alt  17, 238
Alt-F1  128
Alt-F3  142
Alt-F5  126
Alt-F6  126
Alt-F9  149
Alternativa   26
Append  206, 207, 224
Arctan  43
Arctangens   43
ASCII   46, 58, 234, 236
                               Assign  199, 203, 206
                               AssignCrt   237
                               Atributy   69
                               Attributy souboru  222
                               Autoindent  135
                               Backspace   18, 237
                               Bhov chyby  243
                               BGI  13
                               Binrn opertory  80
                               BINOBJ  14
                               Bitov reprezentace  85
                               Bitov reprezentace  80
                               BlockRead  231
                               BlockWrite  231
                               Blok  35
                               Boolean  45, 55, 57, 58
                               Break/Watch/Add watch  175
                               Break/Watch/Clear all
                                   breakpoints  174
                               Break/Watch/Delete watch  183
                               Break/Watch/Edit watch  183
                               Break/Watch/Remove all watches 
                                   183
                               Break/Watch/Toggle breakpoint 
                                   173
                               Break/Watch/View next
                                   breakpoint  174
                               Breakpoint  173
                               Buffer  229
                               Byte   55
                               Carriage Return  210
                               Case   91
                               asova   233
                               Celoseln typy  57
                               Char  46, 55, 57
                               ChDir  220
                               CHR    13, 46
                               Chybov hlka  21
                               Chyby  240
                               Chyby v grafice  246
                               sla  29
                               sla zznam  203
                               slice  27
                               Close  202, 217
                               ClrScr  233
                               Code Segment  113
                               Command-line  11
                               COMP   42
                               Compile/Build  149
                               Compile/Compile  149
                               Compile/Destination  148
                               Compile/Find error  157
                               Compile/Get info  141
                               Compile/Make  149
                               Concat  48
                               Const   77
                               Copy  48
                               Cos  43
Cosinus   43
CR   236
Crt   25, 233
Ctrl-Break  171
Ctrl-F1  128
Ctrl-F2  174
Ctrl-F3  185
Ctrl-F4  183
Ctrl-F8  173
Ctrl-F9  166
Ctrl-G  183
Ctrl-KD  136
Ctrl-Kn  139
Ctrl-KQ  136
Ctrl-KS  136
Ctrl-L  138
Ctrl-OO  139
Ctrl-P  137
Ctrl-Q[  139
Ctrl-Q]  139
Ctrl-QA  138
Ctrl-QF  137
Ctrl-Qn  139
Ctrl-R  124
Ctrl-U  138
Ctrl-W  137
Ctrl-Y  183
Ctrl-Z  137
CtrlBreak   245
Data  23
Data Segment  113
Datov objekty  23
Datov struktury  24
Datov typy  23
Datov typy jednoduch   23
Datov typy strukturovan  23
Debug/Call stack  158
Debug/Display swapping  172
Debug/Evaluate  175
Debug/Find procedure  186
Debug/Integrated debugging  170
Debug/Refresh display  173
Debug/Stand-alone debugging 
   157
Debugger   118
Dec  58
Ddinost   67
Deklarace   23, 29
Deklarace globln  23
Deklarace lokln  23
Del   18
Delay  233
Delete  49
Dlku etzce   48
Destruktor   68
Direktivy kompiltoru  150
DiskFree  221
Diskov pamti  198
                               Diskov soubory  230
                               DiskSize  221
                               Distribun disketa  12
                               Do   93, 94, 98
                               Doln byte  39
                               Dos   25, 240
                               DOS Errors  244
                               DosError   243
                               DosExitCode  243
                               DOUBLE   41
                               Downto   94
                               Druh mocnina   44
                               Dynamick promnn  24
                               Dynamick struktury  53
                               Dynamickch metod  67
                               Editor   118
                               Else   91
                               E 141
                               Emulace   39
                               End   18
                               ENTER   237
                               Enter,   18
                               Eof   202, 206, 208, 237
                               Eoln  206, 210
                               Erase  220
                               Esc  17, 236
                               Exit  108
                               Exp  43
                               EXTENDED   42
                               External   244
                               Extern podprogramy  146
                               F1  128
                               F10  126
                               F10.     17
                               F2  19, 21
                               F3  22
                               F4  143, 173
                               F5  22, 126
                               F6  126
                               F7  172
                               F8  172
                               F9   22, 149
                               F9.    20
                               False   45, 79
                               FAR   110
                               FExpand  221
                               File  24
                               File/Change dir  141
                               File/Directory  142
                               File/Load  142
                               File/New  144
                               File/OS shell  146
                               File/Pick  142
                               File/Quit  146
                               File/Save  145
                               File/Write to  145
                               FilePos   204
                               FileSize   205
FindFirst  221
FindNext  222
Flush  230
Font  13
For   94
Formln parametry  102
Formtovac symboly  179
Forward   110
Frac  43
FSearch  223
FSplit  224
Funkce  25, 31
Funkce pro zaokrouhlovn  44
Fyzick soubor  196
GetDir  225
GetFAttr  225
GetFTime  225
Go to cursor  173
Goto   95, 96
GotoXY  233
Grafick adaptr  13
Graph   26, 233, 240
GRAPH.PPU  13, 15
Graph3   26
GraphErrorMsg  246
GraphResult   246
GREP  14
Halt   243
Help  128
Hexadecimln sla  29
Hi  38
Hierarchick uspodn   67
Hlavika   103
Hlavika programu  29
Hlavn menu  17
Hodnotou  104, 105
Hodnotu   77
Home   18
Horn byte  38
Hostitelsk typ  56
HOT KEY  189
I/O Errors  244
Identick typy  86
Identifiktor   24
Identifiktory   28
Inc  58
INCLUDE soubor  146
Indentace  131
Inf   40
Informan pole  17
Inline   74, 244
Input  73, 217
Insert  49, 130
Inspekce   99
Instalace  16
INSTALL  12
Instance   69
Int  43
                               Integer   55
                               Integrovan systm  11
                               Interrupt   74
                               Interval   23, 57, 58
                               IOResult  228, 243
                               Jsou  36
                               Keep  243
                               KeyPressed  234
                               Klvesnice  218, 234
                               Koment   29
                               Komente   35
                               Kompatibilita typ  86
                               Kompatibiln   86
                               Kompiltor   118
                               Konfigurac    15
                               Konfiguran soubory  188
                               Konstantn vraz  79
                               Konstanty   24
                               Konstruktor   68
                               Koprocesor 6888?  10
                               Koprocesoru   39
                               Kurzor  18
                               KVALIFIKACE   78
                               Kvalifikovan identifiktor 
                                   182
                               Kvalifikovat   98
                               Label    96
                               Length  48
                               Leterl   79
                               LF   236
                               Lich slo  38
                               Line Feed  210
                               Linker   118
                               Literly   24
                               Ln  43
                               Lo  39
                               Logaritmus   43
                               Logick soubor  196
                               Lokln promnn  114
                               Longint   55
                               Ludolfovo slo   43
                               MAKE  14
                               Maxint  37
                               Maxlongint  37, 42
                               Menu   17
                               Menu "Break/Watch"  122
                               Menu "Compile"  20
                               Menu "Debug"  121
                               Menu "File"  17, 18
                               Menu "Options"  121
                               Menu "Run"  21
                               Metody   67
                               MkDir  226
                               Mnoina   24, 80
                               Mdy editoru  130
                               Monitor    233
                               NaN  40
                               Nslednka   57
Nvt    96
NEAR    110
Nepovinn st   27
Nestandardn datov typy   23
Neterminly  26
Netypovan soubor  73
Netypov parametry  104, 106
Nil  52, 79
NONAME.PAS  18
NoSound  234
NOT   79
Object  67
Object moduly  146
OBJECT soubor  146
Objekt   78
Obrazovka IS  125
Odd  38
Oddlovae   28
Odkazem  104, 105
Odmocninu   44
Of    91
Offset   52, 110
Ofs  53
Okno "Edit"  125
Okno "Output"  125
Okno "Watch"  125
Opakovac faktor  178
Operace   31
Opertor   33
Opertoru dereference  53
Opertory nsoben  81
Opertory stn  81
Optimal fill  136
Options/Compiler/Align data 
   153
Options/Compiler/Boolean
   evaluation  154
Options/Compiler/Conditional
   defines  162
Options/Compiler/Debug
   information  157
Options/Compiler/Emulation  156
Options/Compiler/Force far
   calls  152
Options/Compiler/I/O checking 
   152
Options/Compiler/Local symbols 
   158
Options/Compiler/Memory sizes 
   160
Options/Compiler/Numeric
   processing  154
Options/Compiler/Overlays
   allowed  153
Options/Compiler/Range checking 
   151
Options/Compiler/Stack checking 
   151
                               Options/Compiler/Var-string
                                   checking  153
                               Options/Directories/Current
                                   pick file  187
                               Options/Directories/PRG & PPU
                                   directory  148
                               Options/Directories/Include
                                   directories  147
                               Options/Directories/Object
                                   directories  147
                               Options/Directories/Pick file
                                   name  187
                               Options/Directories/Pure
                                   directory  129
                               Options/Directories/Unit
                                   directories  147
                               Options/Environment/Backup
                                   files  139
                               Options/Environment/Config auto
                                   save  187
                               Options/Environment/Edit auto
                                   save  139
                               Options/Environment/Screen size 
                                   139
                               Options/Environment/Tab size 
                                   131
                               Options/Environment/Zoom
                                   windows  125
                               Options/Linker/Link buffer  164
                               Options/Linker/Map file  129
                               Options/Parameters  167
                               Options/Retrieve options  188
                               Options/Save options  188
                               Ord  45, 57
                               Ordinalita   57, 58
                               Ordinln typy   57
                               Ordinlnch typ  55
                               Output  73, 217
                               Overlay   25, 153, 240, 245
                               Overwrite  130
                               OvrResult  245
                               Oznaen blok  133
                               Oznaen skupiny soubor  123
                               Packed   59
                               PackTime   227
                               Pedchdce   57
                               Pedek   67
                               Pepna IS  122
                               Pepnae editoru  131
                               Pepnae kompiltoru  150
                               Peteen   84
                               Petypovn  78, 80
                               Piazovac pkaz  77, 86, 90
                               Pkaz  23
                               Pkaz CASE  91
                               Pkaz editoru  123
                               Pkaz FOR  94
                               Pkaz IF  91
Pkaz IS  122
Pkaz REPEAT  93
Pkaz skoku  95
Pkaz WHILE  93
Pkaz WITH  97
Pkazy pro pohyb kurzoru  131
Pkazy pro prci s bloky  133
Pkazy pro vkldn a mazn
   textu  132
Parametr IS  122
Parametry  104, 114
PATH  224
PathStr  221
Pevn st  62
Pi  43
PICK seznam  144
PICK soubor  129, 187
Psmena  27
Podetzec   48
Podmnkov symboly  161
Podobjekt   69
Podprogramy  25
Pointer  54
Pojmenovan konstanty  24
Pole   24, 78
POP   112
Pos  49
Potomek  67
Pozici podetzce   49
Przdn mnoina  66
Przdn pkaz  90
Pred  57
Prefix   69
Primitivn soubory  199
Printer   26
Priorita opertor  82
Procedury  25
Program  23, 29
Promnn   24
Ptr  53
PUSH   112, 114
Read   201, 206, 215
ReadKey  234, 236, 237
Readln   206, 211, 217
README  12
REAL   41
Rekurze    108
Relan opertory  82
Rename  226
Repeat    93
Reprezentuj  37
Reproduktor   234
Reset  199, 200, 203, 206, 207,
   231
Rewrite   199, 200, 203, 206,
   207, 231
RmDir  226
Round  44
                               Rozen soubor  129
                               Rozliovac poloka  63
                               Rozliovac typ   63
                               Run/Program reset  174
                               Run/Run  166
                               Run/Step over  172
                               Run/Trace into  172
                               Run/User screen  125
                               RunError   243
                               Seek   205
                               SeekEof  209
                               SeekEoln  210
                               Seg  53
                               Segment   52, 110
                               Sekvenn pamov mdia  197
                               Self  107, 113
                               Separtn kompilaci  25
                               SetFAttr  226
                               SetFTime  227
                               SetTextBuf   229
                               Seznam   27
                               Shortint   55
                               Sin  43
                               SINGLE   41
                               Sinus   43
                               Skuten parametry  102, 104
                               Slovo  130
                               Sloen pkaz  90
                               Soubor   22, 24, 72, 196
                               Soubor zznam  198
                               Soubory s pmm pstupem 
                                   196, 198
                               Soubory sekvenn  196
                               Sound  234
                               Speciln symboly  27
                               Specifiktory formtu  178
                               Spodn informan dek  123
                               Spojen etzc   48
                               Sqr  38, 44
                               Sqrt  44
                               Stack Segment  113
                               Standardn typy  23
                               Standardn unity   25
                               Statick promnn   24
                               Stavov dek  131
                               Str  49, 214
                               String  47, 61
                               Strukturovan typy   59
                               Succ  45, 57
                               Success           21
                               Sud slo  38
                               Swap  39
                               Syntax jazyka   26
                               System   26
                               Tab  130
                               Tlo   108
                               Terminly  26
                               Test6888?  156
Text  199, 206, 210
TextBackground  233
TextColor  233
Textov soubory  206
Textov soubor  73
THELP  13
Then   91
TINST  14
TINSTXFR  14
To   94
TOUCH  14
TOUR  13
TPC        12
TPC.PRG  11
TPCONFIG  15
PPUMOVER  15
TRUE   79
Trunc  44
Truncate  227
PURE      12
Pure Debugger  157
PURE.PRG  11
PURE.PCK  187
PURE.TP  188
PURE.TPL  15
Pure3   26
Typ   78
Type  77
Typovan konstanty  42, 46, 60,
   71
Typovan soubor  73
Typy   31, 35
Ukazatel  23, 35, 78
Ukazatele   51
Unrn opertory  79
Unindent  136
Unit   78
Unity  25
UNPACK  13
UNPACK.   15
UnpackTime  226
Until   93
UpCase  46
UPGRADE  15
Uses   29, 233
UTILS  14
Uzvorkovn   79
Uivatelsk obrazovka  125
Val  51, 216
Var  77, 104
Variantn st zznamu  62
Vta jazyka  27
Vtov typy  23
Vtovho typu   58
Vtov typ  57
Videoadaptery:    10
Vkonn pkazy  23
Vraz   33, 77
                               Virtual  69
                               Virtual method table   70
                               Virtualizace   67
                               Virtuln metody  69
                               Vsledek funkce  106, 116
                               Vstup programu  22
                               Vstupn zazen  197
                               VMT  70, 113
                               Vnoen podprogram  74
                               Voln   104
                               Vstupn-vstupn zazen  197
                               Vstupn pole  124
                               Vstupn zazen  197
                               Vyhrazen slova  28
                               Vyrovnvac pam  229
                               While   93
                               With  65, 72, 98
                               Word   55
                               Write   200, 201, 206, 212
                               Writeln  206, 211, 215
                               Zkladn symboly  27
                               ZAKRYT   107
                               Zlon kopie  140
                               Zsobnk    112
                               Zznam   24, 61, 67, 78





  Autoi:        RNDr. Tom RUBA
                 RNDr. Jana VINOV
                 RNDr. Eva NOVKOV
                 RNDr. Tom EHK


  Nzev:         TURBO PASCAL, prvn dl


  Vydavatel:     Systmov a programtorsk servis MON Praha






                 Tato publikace neprola redakn ani jazykovou
                         pravou v redakci nakladatele.



