Všechny podprogramy, sestavené pro soubor PMD, musí být rozepsány
ve standardním FORTRANu 77. Žádné odchylky, nebo rozšíření se nepřipouštějí.
Výjimky byly přijaty jen ve standardních podprogramech pro čtení
vstupních údajů, kde se pracuje s integer-ekvivalenty alfanumerických
znaků. Tyto ekvivalenty se pro některé počítače liší, potřebné modifikace
nejsou rozsáhlé. Modifikace pro různé operační a výpočtové systémy lze
nalézt ve zdrojích podle znaku '#' . Ve všech podprogramech PMD se dále
používá následující programátorský obrat, který není ve standardu FORTRANu
uveden, ale jehož přípustnost je ověřena praxí na všech dostupných počítačích:
předpokládá se, že jsou-li v C0MMON-bloku proměnné zapsány v určitém
pořadí, jsou tak uloženy i v paměti. Napíšeme-li tedy:
DIMENSION ABC(21) EQUIVALENCE (ABC(1),A(1)) COMMON // A(5), B(7), C(9)
můžeme očekávat, že bude např. B(5) = ABC(10)
Práce s pamětí
Používá se "kvazidynamická" deklarace paměti. Operace ve vnitřní
paměti se provádějíve vzájemně ekvivalentních pracovních polích INT
(typu integer) a R (typu real), do kterých se potřebná pole
proměnných vnořují. Číselné hodnoty dimensí LI a LR polí
INT a R, se určí mimo program podle rozsahu řešené úlohy.
V programu se uvedou jen v řídícím segmentu (MAIN) ve výroku DIMENSION
a dvěma přiřazovacími výroky se zavedou jako proměnné, používané v parametrech
dále vyvolávaných podprogramů. Ke změně nároku celého programu na paměť
stačí změnit hodnoty LI, LR pouze v těchto místech. Polím proměnných
v podprogramech vyvolávaných ze segmentů MAIN se paměť přiděluje dynamicky
pomocí parametrů subrutin.
Při stanovení LI, LR je třeba respektovat relaci
délky čísla typu real a čísla typu integer na daném stroji, která je
vyjádřena číslem ICL, zavedeným na začátku řídícího segmentu.
Postup je zřejmý z následujících příkladů. Prakticky se velikost paměti
nastavuje pomocí příkazu PARAMETR např. PARAMETER
(LI = 3000000) a dále platí LR = LI/2 . Nárok
programu na paměť je 4*LI [B].
Tento přístup má však nevýhodu, že uživatel musí po ruce kompilátor pro případné
zvětšení paměťového nároku úlohy, či pro případ počítače s měnší velikostí
operační paměti. Proto bylo použito dynamické alokace funkcí MALLOC podle
nároků provozovaného programu. Protože funkce MALLOC není standardní pro
všechny kompilátory, byly vytvořeny nové hlavní programy s názvem zakončeným
písmenem 'A' (např. RMD3 -> RMD3A). Program nejprve přečte COMMON a spočte
požadovanou délku LI, kterou pak alokuje funkcí MALLOC.
Vyjímku tvoří programy zpracování sítě a okrajových podmínek, kde načátku
nelze maximální požadovanou délku LI určit. Tyto programy jsou zkompilovány
s vhodnou délkou LI. Pokud program skončí s chybou o nedostatečné velikosti
LI, musí se program spustit s parametrem před jménem úlohy -MLI 10000000
nebo -M 40, kde v prvním případě se jedná o po6adovanou velikost LI a v
druhém případě přímo o velikost paměti v [MB].
Příklad 1
Na počítači nechť real zabírá dvojnásobek paměti pro integer,
čili ICL = 2. Máme deklarovat paměť pro úlohu, která potřebuje
LI = 10000 integerů. Do pole INT má adresy LBINE máme vnořit
pole INE délky LINE a do pole R od LBRPD pole RPD délky LRPD. Bude:
DIMESION INT (10000), R (5000), ... COMMON /CPMD/ .....ICL, ...LINE, ..LRPD, .... EQUIVALENCE (INT(1),R(1)0,. . . . . ICL = 2 . . LI = 10000 . . LR = LI/ICL . . CALL PROBD (INT,LI,R,LR) · . (PROBD m.j., určí délky LINE,LRPD a uloží je do /CPMD/ . CALL SCMD (INT,LI,R,LR,.....LBINE,...LBRPD,...) (SCMD m.j. určí indexy LBINE a LBRPD) . . CALL SUBRl(INT,LI,R,IR,INT(LBINE),LINE,R(LBRPD),LRPD,..) . . END . . SUBROUTINE SUBRl (INT,'LT,R,LR,INE,LI1~E,RPD,IR,PD,.....) . . DIMENSION INT(LI),R(LR),INE(LINE),RPD,LRPD),... . . END
Příklad 2Na místě pole INE z příkladu 1. chceme umístit real-
pole T. Adresa začátku pole T, vnořeného do R bude:
LBT = (LBINE - 1) / ICL + 1
M-tý prvek pole T má v R adresu LBT - I + M .
Příklad 3
Na místě real-pole RPD z příkladu l umístit integer-pole ICD.
Adresa začátku pole ICD bude:
LBICD = (LBRPD - l) * ICL + 1
N-tý prvek pole ICD má v INT adresu LBICD - 1 + N a
vyjádří se jako INT(LBICD - 1 + N) .
Přenos informace mezi subroutinami a programy
Ve FORTRANu lze informaci mezi subroutinami a podprogramy přenášet
jen pomocí jejich parametrů, nebo prostřednictvím COMMON-bloku. Přenos
pomocí parametrů je poněkud pomalejší. Velký počet parametrů u rozsáhlých
subroutin bývá zdrojem chyb, které nejsou některými kompilátory testovány.
Přenos prostřednictvím COMMONu má závažnou nevýhodu v tom, že při použití
převzatého podprogramu není z jeho výpisu jasné, zda jednotlivé v bloku
uvedené položky v něm skutečně svými hodnotami již jsou, nebo zde je třeba
je tam zavést apod. Pojmenované COMMON-bloky musí podle standardu mít
ve všech podprogramech programu stejnou délku, což je také nepohodlné.
Různou délku smí mít jen nepojmenovaný COMMON //. Proto se v poslední
době na některých pracovištích dává přednost přenosu informace výhradně
pomocí parametrů subroutin. Při jejich vhodné organizaci je tím zaručena
dokonalá kompatibilita subroutin při zachování jejich nezávislosti. Je
jasné, co do subroutiny vstupuje a co z ní vystupuje.
Úplné opuštění COMMONU se nám nicméně nezdá správné. Pro PMD navrhujeme
přenos informace mezi subroutinami uspořádat tak, aby bylý plně využity
výhody obou možností přenosu při potlačení jejich nedostatků.
Přenos informace pomocí COMMON-bloku /CPMD/
V celém PMD se bude používat jediný pojmenovaný
COMMON-blok /CPMD/
, který může být zařazen do každé subroutiny. Má tyto vlastnosti:
má jednotnou strukturu, kterou nesmí nikdo mimo dovolený rozsah
měnit. Je popsána zde
. Jména proměnných si musí programátor osvojit, jde o základní parametry
většiny úloh, nesmí se měnit. V podprogramech se nevysvětlují;
obsahuje hlavní konstanty úloh, jejíchž hodnoty se do něj zařazují
automaticky pro zpracování popisu sítě programem RMD2/3 a blokem RPD2/3,
kterými musí každé úloha projit. Odpadá tedy starost, zda tyto hodnoty
v /CPMD/ jsou;
obsahuje údaje potřebné k restartu úloh s KREST = 4. Jde o vstupní
údaje, které se vždy čtou z IP, resp. RP-štítku při KREST < 4, čímž
musí každá úloha, nutné projít. Údaje jsou v poli ICC, resp. RCC v /CPMD/
a s ním se dumpují do vnější paměti, viz dále. Po selháni stroje a restartu
s KREST = 4 stačí je odtud vzít jako při KREST = 4;
obsah /CPMD/ se automaticky nuluje při jeho prvním použití,
tj. zpravidla na začátku při zpracování popisu sítě z preprocesoru;
na konci zpracování sítě se obsah /CPMD/ ukládá do periferie
č. IDCOM výrokem CALL WCOMD,
na začátku řídícího segmentu (MAIN) každého následujícího programu
se z této periferie přečte výrokem CALL RCOMD
zapisují a čtou se pouze části /CPMD/, které mají trvalou povahu,
tj. pole ICP(160), RCP(48)
pracovní části ICP(160) a RCP(336) mají pevnou pouze svou délku.
Jejich struktura je zčásti dána použitými podprogramy SDT , zčásti
si je určuje programátor-uživatel. Obvykle se struktura navrhne pro určitou
významnou etapu řešení a uvede se v podprogramu-bloku, který tuto etapu
representuje v řídicím segmentu programu (např. blok pro výpočet
všech matic a pravých stran všech prvků sítě). Podprogramy nižší úrovně
(s výjimkou podprogramů SDT) již s touto strukturou ICW a RCW nemusí
pracovat a informaci v těchto částech /CPMD/ uloženou mohou přebírat
pomocí svých parametrů, což zvyšuje jejich universálnost.
blok /CPMD/ může být v podprogramu uveden buď v rozepsaném tvaru (pracuje-li
se s více jeho položkami), nebo stručně, jako:
COMMON /CPMD/ ICP(160), ICW(160), RCP(48), RCW(336)
Stručný zápis je na místě, pokud se v podprogramu pracuje jen
s několika málo položkami, které 1ze zpřístupnit jednoduše pomocí
výroku EQUIVALENCE. Chceme-li např. zpřístupnit položky LINET,
LNNET, píšeme:
EQUIVALENCE (ICP(18),LINET),ICP(l9),LNNET)
Čísla položek se snadno zjistí - viz
popis COMMONu /CPMD/
, takže riziko omylu není velké.
jména položek /CPMD/ se nesmí objevit v parametrech podprogramu, uvnitř
něhož v /CPMD/ vystupují. U délek polí se tomu nelze vyhnout a proto se
tyto délky pro tento účel dočasně přejmenují zdvojením prvního písmene při
respektování dovolené délky jména
(5 znaků) .
Parametry subroutin se předně používají ke sdílení paměti,
viz zde
a dále k přenosu hodnot proměnných. Protože v PMD dáváme přednost
krátkým subroutinám, je možné udržet počet jejich parametrů v rozumných
mezích. Pro složité úkony se konstruují podprogramy-bloky, které jen
vyvolávají podprogramy nižší úrovně pro dílčí úkony. Blok si obyčejně
provádí rozvrh paměti sám nebo používá standardní rozvrh, jehož parametry
bere z /CPMD/, takže má zpravidla jen parametry INT,LI,R,LR.
Aby bylo zřejmé, které parametry jsou vstupní a které výstupní,
zavádí se tato úprava parametrů:
nejprve se píší všechny parametry vstupní, přičemž parametry INT,LI,R,I
mají vždy přednost a až pak se po dvou mezerách uvedou parametry
výstupní
parametry, které jsou povahy vstupní i výstupní, se umístí jako
vstupní a skutečnost se vysvětlí v záhlaví podprogramu (např. pole,
jehož obsah se činností podprogramu změní),
u polí se píše nejprve jméno, pak jeho délka. Má-li několik polí
stejnou délku, uvede se tato délka v parametrech samozřejmě jen
jednou a to za posledním jménem pole, k němuž patří.
Příklad 4
SUBROUTINE SUBRR(INI,LI,R,LR,INE,LLIINE,AS,BS,LAB,H,LH) DIMENSION INT(LI),R(LR),INE(LLINE),AB(LAB),BS(LAB),H(LH) COMMON /CPMD/ . . . . LINE . . . . .
Přenos informace mezi programy
Základní parametry úlohy se přenášejí pomocí COMMONu /CPMD/ -
viz zde
, který se dumpuje na periferii č. IDCOM. Pro přenos rozsáhlých souborů
údajů mezi programy se používají sekvenční soubory ve vnější paměti,
tj. na disku nebo dříve na magnetické pásce. Jejich čísla se povinně
zavádějí v řídících segmentech programů a ukládají se do /CPMD/, s nímž
se í dumpují. Jde o položky IDGMI až IDA2. O práci se soubory -
viz zde
Detaily programování
Dále uvedené směrnice mají smysl doporučení. Nezbytně nutné je dodržet
pouze pravidla přenosu informace mezi podprogramy, zatímco odchylky od
pravidel grafické úpravy a značení lze v případech přejatých podprogramů
tolerovat.
Podprogramy psané pro PMD musí všem požadavkům směrnic vyhovovat.
Docílí se tím čitelnost a srozumitelnost programů, která by měla být jednou
z hlavních předností PMD,
Výběr instrukcí
C0MM0N se smí v PMD používat jen s omezením podle odstavce
. EQUIVALENCE - použití se omezuje jen na deklaraci ekvivalence polí
INT a R v řídícím segmentu programu a k přidělování významu položkám
polí v /CPMD/. Zásadně se nesmí používat k "překřtívání" proměnných v
průběhu subroutiny. ARITMETICKÝ IF, tj. např. IF(A-B)100,200,300 se nedoporučuje. Odporuje
přehlednému strukturovaní programu, vede k zvětšení počtu návěští a GO
TO. Nahrazuje se logickým IF. LOGICKÝ IF se používá vždy ve stejné úpravě jako "struktura"; záleží
přitom na počtu testovaných okolností, počtu následků a na tom, chceme-li
zařadit vysvětlivky. Mohou nastat případy:
jen jedna okolnost a jen jeden následek:
IF(ITYP.EQ.3) GO TO 10, nebo IF(ITYP.EQ.1) KHS=-1 okolnost následek
jedna okolnost, více následků, vysvětlivka vhodná:
C IF(KREST.EQ.20 - CHYBA ERROR 600 IF(.N0T.KREST.EQ.2) GO TO 10 CALL ERMES(600) GO TO 40 C ENDIF 10 CONTINUE
jedna okolnost, více následků, vysvětlivka není nutná, věc je jasná
z instrukcí:
IF(.NOT.X.GT.CRIT) GO TO 10 následek
GO TO 40
C END IF
10 CONTINUE
více okolností, na počtu následků a vysvětlivek nezáleží:
C ROZH0D0VANI 0 DALSIM POSTUPU C IF(KK.LT.0) ITERACE DIVERGUJI, KONEC IF(.NOT.KK.LT.0) GO TO 10 následky C EISE IF(KK.EQ.0) ITERACE KONV.,ALE TEST JESTE NENI SPLNEN< 10 IF(.NOT.KK.EQ.0) GO TO 20 následky C EISE IF(KK.GT.0) TEST KONVERGENCE SPLNEN, KONEC 20 následky C ENDIFC C . .
POČÍTANÝ GO TO se pro přehlednost upravuje jednotně takto:
GO TO (10,20,30,40, . . . ),ITYP C C ITYP=1 ~ JEDNOROZMERNY PRVEK 10 vztahy GO TO 90 C C ITYP=2 - CTYRUHELNIK PR0 ROVINNE ULOHY 20 vztahy GO TO 90 C ITYP=3 - KOMPAKTNI PRVEK PRO 3D - ULOHY 30 vztahy GO TO 90 . . . GO TO 90 C END CTGO . .
DO - CYKL - dříve se doporučovalo rozepisování cyklů. Při použití
dnes již běžných optimalizujících kompilátorů to však nepřináší
podstatné zrychlení výpočtu a naopak to prodlužuje program a znesnadňuje
ladění. Rozepisování cyklů je výhodné jen pokud:
počet cyklů je malé a známé číslo (>=5) ,
příkaz cyklu je přitom mnohonásobné vyvoláván,
v cyklu je možno použít neindexované proměnné.
Ve většině případů je tedy lépe použít nerozepsaný
DO-cykl. Úprava pro oba případy je zřejmá z následujícího příkladu
Příklad 5
Máme ve stylu PMD přepsat rozepsaně i nerozepsaně cyklus,který by
" postaru " byl zapsán takto:
DO 5,I=1,N DO 5,J=1,3 5 A(J)=A(J)+ X(I)*B(J)
Nerozepsaný přepis ve stylu PMD je:
DO 1000 I=1,N XI = X(I) DO 2000 J=1,3 A(J) = A(J) + XI * B(J) 2000 OONTINUE 1000 CONTINUE
Ze čtvercové souměrné matice se pracuje jen s její horní
trojúhelníkovou částí (včetně hlavní diagonály), linearizovanou
po sloupcích. Matice řádu N je tedy uložena jako vektor o délce
N*(N+1)/2 :
Člen A(I,J) matice má v tomto vektoru pořadí
J*(J-1)/2+I . Obdélníkové matice se interpretují obvyklým způsobem jako
dvourozměrné pole A(I,J). Jejich linearizace doporučená v l. versi
pravidel programování, program komplikuje a nepřináší očekávané urychlení
výpočtu.
Jiná situace je u vícerozměrných polí, která nejsou zcela zaplněna.
Jako příklad uveďme standardní pole INET, ve kterém jsou postupně pro
všechny prvky zařazena čísla jejich uzlů. Kdyby bylo zavedeno jako
pole dvojrozměrné INET(IE,JH), mělo by dimenze NELEM, NNEX(tj. max.
počet uzlů prvku v dané síti). To by mohlo v síti s prvky s rozdílnými
počty uzlů na prvek vést k plýtvání vnitřní paměti. Proto se pole INE
bere jako jednorozměrné pole, ve kterém je pro každý prvek uloženo
jen tolik čísel uzlů, kolik jich prvek má. To ovšem na druhé straně
znesnadňuje výběr z tohoto pole a proto se sestavuje další pomocné
pole NNET(IE) dimense LNNET, ve kterém je pro každý prvek uložen počet
jeho uzlů. Pole INE se vždy probírá s pomocí pole NNET od začátku.
Volba jmen
Jména proměnných se volí mnemotechnicky, přičemž
se vychází z anglického názvu nebo z obecně užívaného symbolu
(napětí SIG apod.). Jméno proměnné smí mít max. 6 znaků a musí
začínat písmenem. Následně se užívá implicitní deklarace typu.
Názvy proměnných typu integer musí začínat na I, J, K, L, M, N, přičemž
začínají písmenem:
I - názvy čísel (INET - čísla uzlů prvku),
J - názvy pořadí (JN - pořadí uzlu),
N - celkové počty (NNE - počet uzlů prvku, (IINE(JN),JN=1,NNE),
K - názvy klíčů (KMD - klíč rozložení materiálu, Key of Material
Distribution),
L - názvy adres začátků a délek polí
LB jméno pole - adresa 1. položky pole, vnořeného do pracovního
pole INT nebo R. (LBINE - adresa začátku INET),
LF jméno pole - adresa, za kterou toto pole začíná, tj. LF
= LB-1,
L jméno pole - délka pole (LINET - délka pole INET) , (viz
příklady 1
, 2
, 3
)
M - názvy maximálních hodnot (MFRON – max. šířka fronty).
Jména podprogramů smí mít max. 5 znaků. Jména programů smí mít jen 4 znaky. obvykle se volí
zkratka anglického názvu řešeného problému.
Volba návěští
Návěstí se volí jednotně. Rozlišují se podle druhu instrukcí,každému
druhu je přiděleno určité rozmezí návěstí. V každé subroutině
se návěští číslují od začátku příslušného rozmezí. Návěstí se
doráží na 5. sloupec, aby uvnitř subroutiny v 1. sloupci byla
jen písmena C od poznámek, které tím lépe opticky vyniknou. Návěští
instrukcí téhož typu musí uvnitř subroutiny vzrůstat monotónně. Proto
je vhodné,při psaní podprogramu postupovat v návěstí např. po desítkách,
aby se pravidlo o růstu návěští neporušilo při pozdějším vsouvání
dalších návěstí při opravách. Návěstí se volí:
l až 998 – návěstí, na která se odkazuje příkazem GO TO,
999 - návěstí výroku RETURN,
1000 až 4999 - návěstí DO-cyklu, přičemž u vnořených cyklů
se tisíce berou jako násobky úrovně vnoření, viz
příklad 5
,
5000 až 5999 - návěstí formátů pro čtení - dnes se již
pevný formát nepoužívá ,
6000 až 6999 - návěstí formátů pro tisk,
8000 až 8999 - návěstí formátů pro tisk diagnostiky chyb,
9000 až 9999 - návěstí formátů pro tisk ladících tisků.
Grafická úprava
Vysvětlivky (comments) mají usnadnit orientaci v programu
a jeho pochopení v místech, kde nestačí k porozumění znalost
pravidel a zvyklosti PMD a řešené problematiky.
Na začátku programu i podprogramu se v rámečku
končícím v 70. sloupci uvede jednotně uspořádaná informace,
která má obsahovat:
jméno podprogramu (obvykle zkratka),
vysvětleni zkratky,
stručnou charakteristiku podprogramu,
jméno programátora, pracoviště, č.verze, datum,
vysvětlení vstupních parametrů,
vysvětlení vstupních, parametrů,
seznam vyvolávaných podprogramů.
Řádků s vysvětlivkami nesmí být bezprostředně za sebou víc,
než 30. Proto se do zarámované informace neuvádí vysvětlení významu
vnitřních proměnných podprogramu, které se provede pomocí vysvětlivek
uvnitř podprogramu.
Srozumitelnosti a čitelnosti programů velice prospívá členění
výpisu na odstavce, oddělované prázdnými řádky a uvedené nadpisem.
Práce s vnější pamětí
Vnější pamětí rozumíme pevné disky (dříve se používali magnetické pásky
nebo bubny). Pro ukládání informace se ve vnější paměti zřizují
různé diskové soubory
, označované v programu předponou ID a příponou souboru na disku - např.
IDSOL znamená práci s diskovým souborem uloha.SOL . Symbolická
čísla souborů vystupují v /CPMD/. Hodnoty se jim přisuzují v řídících
segmentech programů přičemž se v určitém programu přidělují jen čísla
souborům v tomto programu nově zavedeným. Čísla souborů jimiž se
informace přenáší z programů předcházejících, se přenášejí prostřednictvím
/CPMD/. Zápis i čtení se provádí většinou sekvenčně. Z toho vyplývají
tyto zásady práce s vnější pamětí:
před prvním použitím souboru (např. číslo IDS) se
zařadí pro jistotu výrok REWIND IDS,
do souboru se zapisuje výrokem
WRITE(IDS) I,J,K,X,Y
kde seznam proměnných I až Y může obsahovat jednoduché
proměnné, i pole typu integer i real. Dává se přednost přenosu celého
pole v délce rovné jeho dimensi; je to rychlejší, než pokud by
se napsalo např.: WRITE(IDS)(X(I),I=l,N)
Jde-li o zápis polí vnořených do pracovních polí
INT nebe R,nebo o zápis jen části pole, použije se pro zápis integerového
pole podprogramu WDISC a WRDISC pro realové pole. Např. :
CALL WDISC (INT(LBIEP),LIEP,IDP)
znamená zápis LIEP čísel typu integer, které jsou ve vnitřní paměti
od adresy LBIEP v poli INT do vnější paměti s číslem IDP a to od místa
daného okamžitou polohou periférie při vyvolání
této instrukce. Obdobně se postupuje při zápisu realových hodnot podprogramem
WRDISC;
ze souboru se čte analogicky zápisu, výroky pro integerové proměnné
jsou:
READ(IDS) I,J,K,X,Y
CALL RDISC(INT(LBIEP),LIEP,IDP),
Pro realové proměnné se používá obdobný podprogram RRDISC.
vždy je nutno zapisovat, i číst stejným způsobem. Každému výroku
pro psaní odpovídá určitá poloha pomyslného ukazatele, který je
po zapsání vždy za posledním číslem. Jednotlivé zápisy jsou odděleny
těmito pointery,číst lze vždy jen od jednoho pointeru následujícímu,
jeden čtecí výrok přečte úsek mezi dvěma
pointery. Je-li seznam ve výroku pro čtení delší,
než odpovídá úseku mezi pointery dojde k chybě. Obráceně, pokud
seznam je kratší, pak zbylé neumístěné údaje zaniknou. Byly
z periferie přečteny do bufferu ve vnitřní paměti, ale nebyly nikam
umístěny, protože se to v seznamu nežádalo. Extrémním případem zde
je prázdný READ, který jen způsobí, že čtecí zařízení se přesune na
začátek dalšího záznamu. Opakem prázdného READ je návrat o jeden záznam
zpět , či-li BACKSPACE.
Vyjímku tvoří přímopřístupové soubory IDEQ1, IDEQ2, IDEQN (frontální řešič),
IDPLA(napětí v Gaussových bodech), kde se čtení nemusí provádět sekvenčně
a záznamy lze přepisovat (prvotní zápis se samozřejmě vytváří sekvenčně).
Délka všech záznamů však musí být stejná. Pro práci s přímopřístupovými
soubory se používají tyto podprogramy:
pro čtení - RIDAN , RIDAC, RRDAN, RRDAC
pro psaní - WRDAN
Příklad 6
Do periferie č. IDIS bylo pěti výroky zapsáno postupně
5 polí IPOL1 až IPOL5. Chceme-li nyní přečíst 3. záznam tj. pole
IPOL3, musíme psát: