4.9. LINKAGE SECTION Sekce LINKAGE SECTION obsahuje popisy položek, které nemají svůj úsek paměti přidělen pevně v přeloženém programu, nýbrž jimž bude úsek paměti přidělován dynamicky až v průběhu výpočtu. Tyto položky se většinou využívají při spojování programů. Pravidla pro zápis popisů položek v LINKAGE SECTION jsou stejná jako ve WORKING-STORAGE SECTION, pouze klauzule VALUE je (s výjimkou podmínkových jmen) považována jen za poznámku. Dále oproti WORKING-STORAGE SECTION není přípustná klauzule ENTRY, avšak u položek s čísly úrovně 01 nebo 77 je zase navíc přípustná klauzule EXTRN (viz 4.5.12.). Položky z LINKAGE SECTION mohou být používány ve všech příkazech a klauzulích přesně stejně jako položky z WORKING-STORAGE SECTION. Na rozdíl od položek z WORKING-STORAGE SECTION nemá položka z LINKAGE SECTION přidělen během výpočtu trvale týž úsek paměti o pevné adrese. Úsek paměti je jí přidělován dynamicky v průběhu výpočtu a může být během zpracování i mnohokrát změněn. Přitom na začátku výpočtu není položkám z LINKAGE SECTION (s výjimkou položek s klauzulí EXTRN) přidělen žádný úsek paměti. (Takže v LINKAGE SECTION je vlastně situace stejná jako ve FILE SECTION, kde rovněž na začátku výpočtu nemají položky přidělen žádný úsek paměti, načež je jim úsek paměti přidělován a měněn systémem vstupu/ výstupu při provádění příkazů OPEN, READ, WRITE a CLOSE.) Přidělování úseků paměti položkám z LINKAGE SECTION řídí sám programátor pomocí dále popsaných příkazů a klauzulí. Úsek paměti přidělený položce z LINKAGE SECTION bývá většinou umístěn v některém jiném programu (který je s naším přeloženým programem spojován v jednom běhu spojovacího programu), může se však nacházet i v témže programu, v němž je tato položka popsána, anebo se může nacházet i mimo kterýkoliv ze spojených programů (např. může být ve vstupní/ výstupní oblasti nebo v dynamicky vyhrazené paměti apod.). Pravidla: 1) Každá položka z LINKAGE SECTION s číslem úrovně 01 nebo 77 má v přeloženém programu přidělen jeden ukazatel (4 byty). U položek sdružených pomocí klauzule REDEFINES je tento ukazatel společný. (Žádné jiné úseky paměti nejsou položkám z LINKAGE SECTION v přeloženém programu přidělovány.) 2) Při jakékoliv práci s položkou z LINKAGE SECTION přeložený program předpokládá, že jí přidělený ukazatel obsahuje adresu toho úseku paměti, který je položce právě přidělen a s nímž se tedy má nyní pracovat. 3) Z hlediska přeloženého programu je položka z LINKAGE SECTION ztotožněna s úsekem paměti, jehož počáteční adresa je uložena v ukazateli přiděleném položce, a jehož délka je rovna délce této položky (může být pevná nebo proměnná). Přeložený program předpokládá, že struktura a obsah tohoto úseku paměti odpovídají popisu položky uvedenému v LINKAGE SECTION. Kdyby tomu tak nebylo (jakož i v případě, že by přidělený ukazatel vůbec neobsahoval adresu přístupného úseku paměti o dostatečné délce), může dojít při zpracování položky k chybě. (Lze říci, že u položky z LINKAGE SECTION zná přeložený program všechny vlastnosti s výjimkou adresy této položky, přičemž tato adresa se doplní až dodatečně v průběhu výpočtu.) Příklad: LINKAGE SECTION. 01 ALFA. 02 BETA PIC S999V9 OCCURS 1000. Při provádění kteréhokoliv příkazu zpracovávajícího položku ALFA nebo některou její podřízenou položku přeložený program předpokládá, že ukazatel přidělený položce ALFA bude obsahovat adresu úseku paměti o délce 4000 bytů složeného z tisíce čtveřic bytů, z nichž každá má hexadecimální obsah 3a3b3ced, kde a,b,c,d jsou hexadecimální cifry 0 až 9 a e je hexadecimální cifra 3 nebo 4. Výpočtová desetinná tečka se předpokládá mezi ciframi c a d. (Takovýto obsah se u čtveřice samozřejmě předpokládá pouze v případě, že příkaz hodnotu položky využívá. Pokud ji pouze naplňuje, může být její obsah jakýkoliv. Podobně v případě, že je zpracováván menší počet položek BETA než 1000, může mít přidělený úsek paměti menší délku. Prostě pokud příkaz někam sáhne, musí být kam, a pokud pro něco sáhne, musí to mít strukturu a obsah určený popisem v LINKAGE SECTION.) 4) Na začátku výpočtu je obsah všech ukazatelů přidělených položkám s čísly úrovně 01 a 77 z LINKAGE SECTION nedefinováni (přesněji: je nulový). Výjimku tvoří jen ukazatele přidělené položkám, které mají v popisu klauzuli EXTRN (viz 4.5.12.), která jsou naplněna spojovacím programem již v průběhu spojování (pokud ovšem spojovací program nalezl stejnojmennou "nabídku") - samozřejmě i obsahy těchto ukazatelů smí být v průběhu výpočtu jakkoliv změněny. Neuvažujeme-li klauzuli EXTRN, smí být tedy položka z LINKAGE SECTION použita až poté, když byla některým z dále popsaných způsobů dosazena do jejího ukazatele adresa vhodného úseku paměti (tj. až po předání řízení na příhodný příkaz ENTRY nebo až po provedení příkazu CALL 'ICUGETV' atd.). Při pokusu použít položku z LINKAGE SECTION, jejíž ukazatel dosud nebyl naplněn vhodnou adresou, může dojít k havárii výpočtu. 5) V průběhu výpočtu lze v našem COBOLu dosadit do ukazatele přiděleného položce z LINKAGE SECTION s číslem úrovně 01 nebo 77 adresu přiděleného úseku paměti těmito způsoby: a) Předat řízení z jiného programu (teoreticky i z našeho programu) do našeho programu na příkaz ENTRY s klauzulí USING, v níž je naše položka uvedena (viz 11.2.). b) Předat řízení z jiného programu do našeho programu na jeho začátek, přičemž záhlaví oddílu procedur našeho programu musí mít tvar PROCEDURE DIVISION USING..., kde v klauzuli USING je naše položka uvedena (viz 11.7.). c) Pomocí příkazu "CALL 'ICUGETV' USING položka" (viz 17.4). d) Pomocí příkazu CALL (viz 11.1.) s argumentem "/ položka" nebo pomocí příkazu UFO (viz 10.3.); adresu musí ovšem dosadit uživatel ve vyvolaném podprogramu nebo příkazem UFO sám. Lze přitom zařídit, aby nadále bylo možno dosazovat do ukazatele adresu vhodného úseku paměti i pomocí obyčejných příkazů typu MOVE, ADD, SUBTRACT, COMPUTE, CALL atd. e) Pomocí podklauzule GIVING v klauzuli USE AFTER ERROR PROCEDURE (viz 5.5.2.). f) Pomocí příkazu LOAD, u něhož je jakožto druhý argument uvedena naše položka (viz 11.9.). g) Pomocí podprogramu ICVIRG (viz 17.19) volaného příkazem CALL 'ICVIRG' USING položka soubor ['READ'] h) Pomocí příkazu "CALL 'ICIDENT' USING položka argument { increment | VALUE }..." (viz 17.26). Příklad: hlavní program vedlejší program WORKING-STORAGE SECTION. LINKAGE SECTION. 77 X PIC S9(5)V99 COMP-3. 77 A PIC S9(5)V99 COMP-3. 01 Y. 01 B. 02 Z PIC X(80) OCCURS 10. 02 C PIC X(80) OCCURS 10. : : CALL 'SLON' USING X Y ENTRY 'SLON' USING A B Příkaz CALL předá řízení z hlavního programu do vedlejšího programu na příkaz ENTRY. Zároveň se do ukazatele přiděleného položce A uloží adresa položky X a do ukazatele přiděleného položce B uloží adresa položky Y. Až bude ve vedlejším programu prováděn nějaký příkaz pracující s položkou A, bude jakožto adresa zpracovávaného úseku paměti použita adresa uložená v ukazateli přiděleném položce A (tj. adresa položky X), takže patřičná akce se bude ve skutečnosti provádět s položkou X (jakkoliv ta leží v hlavním a nikoliv ve vedlejším programu). Akce se ovšem provádí dle popisu položky A, takže za normálních okolností by měly mít položky A a X stejné popisy (až na číslo úrovně, jméno položky a klauzule REDEFINES, VALUE, ENTRY a EXTRN). Položka A zůstane ztotožněna s položkou X až do dalšího předání řízení na týž nebo i na jiný příkaz ENTRY s položkou A za USING, jenž uloží do ukazatele přiděleného položce A novou adresu jiného úseku paměti, anebo do naplnění ukazatele přiděleného položce A nějakým jiným způsobem (viz bod 5 výše). Stejný vztah je i mezi položkami B a Y. 6) Položky z LINKAGE SECTION s čísly úrovně 02 až 49 a 66 nemají přidělena zvláštní slova. Adresa jim přiděleného úseku paměti se získá tak, že se přičte patřičný přírůstek k té adrese, která je uložena v ukazateli přiděleném jejich nadřízené položce s číslem úrovně 01, kterýžto ukazatel tedy musí být již naplněn (tzn. nadřízená položka s číslem úrovně 01 musí mít již přidělen úsek paměti, s nímž je ztotožněna). Příklad: Je-li v předešlém příkladu položka B ztotožněna s položkou Y, dostanou tím též všechny položky podřízené k položce B přiděleny úseky paměti, a sice bude ztotožněno C(1) se Z(1), C(2) se Z(2), ..., C(10) se Z(10). Poznámka: Je-li tedy (ať už kterýmkoliv způsobem) uložena adresa vhodného úseku paměti do ukazatele přiděleného určité položce z LINKAGE SECTION s číslem úrovně 01, lze pak pracovat nejen s touto položkou, ale i se všemi jejími podřízenými položkami a dále se všemi položkami, které jsou s ní sdruženy pomocí klauzulí REDEFINES a se všemi jejich podřízenými položkami. Příklad: LINKAGE SECTION. 01 A. 02 B PIC X(10). 02 C PIC 9(6). 01 D REDEFINES A. 05 E PIC X OCCURS 100. Po předání řízení z jiného programu za příkaz "ENTRY 'PES' USING A" (resp. po jakémkoliv jiném naplnění ukazatele přiděleného položce A) lze používat všechny položky A, B, C, D, E(1), ..., E(100). (Nikterak zde nevadí, že položka D má větší délku než A, pokud ovšem má přidělený úsek paměti dostatečnou délku.) Přesně stejný význam by měl i příkaz "ENTRY 'PES' USING D". Poznámka: V LINKAGE SECTION nemá smysl popisovat žádné jiné položky než položky s klauzulí EXTRN a položky, jejichž ukazatele jsou dynamicky naplňovány některým ze způsobů uvedených v bodě 5; dále pak položky jim podřízené a položky sdružené s nimi pomocí klauzulí REDEFINES a položky těmto položkám podřízené. Poznámka: Dosazujeme-li pomocí některého z výše uvedených způsobů adresy úseků paměti do jednoho nebo více ukazatelů, ostatní ukazatele zůstávají nezměněny, takže jim odpovídající položky zůstávají i nadále ztotožněny se svými doposud přidělenými úseky paměti. Tak např. lze při prvním volání podprogramu přidělit úseky paměti některým položkám z LINKAGE SECTION, načež toto přidělení nebude při dalších voláních téhož podprogramu měněno, takže tyto položky budou mít přiděleny tyto úseky paměti beze změny po celou dobu výpočtu. (Využívá se přitom rovněž skutečnosti, že se při návratu z podprogramu zpět do hlavního programu obsahy ukazatelů nemění, takže se ztotožnění položek z LINKAGE SECTION s přidělenými úseky paměti neruší.) Poznámka: Položky z LINKAGE SECTION s čísly úrovně 01 a 77 mají obdobný význam, jako formální parametry procedur v jazycích ALGOL, FORTRAN, PASCAL, C atd. 4.10. Výplňkové byty Překladač zajišťuje, aby adresa první položky z WORKING-STORAGE SECTION byla dělitelná osmi a dále aby adresa každé položky s číslem úrovně 01 z WORKING-STORAGE SECTION nebo z COMMUNICATION SECTION byla dělitelná osmi. U položek s USAGE COMP, COMP-1, COMP-2 nebo INDEX, které mají v popisu klauzuli SYNC (SYNCHRONIZED) (při zadání parametru CBL ALIGN u všech těchto položek, i u těch, které klauzuli SYNC nemají), platí: a) U položky s číslem úrovně 77 z WORKING-STORAGE SECTION překladač zajišťuje, aby její adresa byla dělitelná dvěma resp. čtyřmi resp. osmi (viz 4.5.7.). b) U položky s číslem úrovně 02 až 49 z kterékoliv sekce překladač zajišťuje, aby byl rozdíl její adresy oproti adrese její nadřízené položky s číslem úrovně 01 dělitelný dvěma resp. čtyřmi resp. osmi (viz 4.5.7.). Ve WORKING-STORAGE SECTION a v COMMUNICATION SECTION (kde je adresa 01 vždy dělitelná osmi) bude tedy adresa položky dělitelná dvěma resp. čtyřmi resp. osmi. Ve FILE SECTION však úseky paměti pro logické věty 01 přiděluje systém vstupu/výstupu, jenž obecně nezaručuje (obzvláště při RECORDING V resp. U) zarovnání adresy 01 na hranici dvouslova. V LINKAGE SECTION přiděluje úseky paměti pro položky s čísly úrovně programátor (viz 4.9.), na němž záleží, zda adresa 01 bude nebo nebude dělitelná osmi (povinné to není a i při liché adrese proběhnou všechny příkazy řádně, byť trochu pomaleji). V těchto dvou sekcích tedy opatření překladače ještě nezaručuje, že bude adresa zmíněné položky skutečně dělitelná dvěma resp. čtyřmi resp. osmi. Pokud položka předcházející k té, jejíž adresa má být zarovnána, nekončí na příhodné adrese (dělitelné dvěma resp. čtyřmi resp. osmi), překladač za ní vynechá několik nevyužitých bytů (až po nejblíže vyšší adresu dělitelnou dvěma resp. čtyřmi resp. osmi) zvaných výplňkové byty. Příklad: WORKING-STORAGE SECTION. 77 A PIC 99. 01 B. 02 C PIC XXX. 02 D PIC 999 COMP SYNC. 02 E USAGE INDEX SYNCHRONIZED. 02 F COMP-2 SYNC. výplňkové byty (2-8,11-12,14-16,20-24) 0 2 4 6 8 10 12 14 16 18 20 22 24 .... 32 |-----------| |-| |---| |-------| .... | |---|-----------|-----|-|---|---|-------|-------|----------| |-A-| |--C--| |-D-| |---E---| |-----F----| |--------------------B---------------------| Pravidla: 1) K elementární položce se nikdy nezapočítávají žádné výplňkové byty. 2) První byte skupinové položky je vždy shodný s prvním bytem její první podřízené položky. Pokud by tedy před touto první podřízenou položkou vznikly nějaké výplňkové byty, nikdy se nezapočítávají do nadřízené skupinové položky. 3) Poslední byte skupinové položky je až na jedinou výjimku vždy shodný s posledním bytem její poslední bezprostředně podřízené položky (tj. poslední položky, která je jí podřízena bez "mezistupně"); pokud by tedy za tímto posledním bytem vznikly nějaké výplňkové byty, nezapočítávají se do nadřízené skupinové položky. Výjimka nastává u skupinové položky s klauzulí OCCURS, pokud některá z jejích podřízených položek vyžaduje zarovnání adresy. Pak se na konec každého exempláře této skupinové položky přidá tolik výplňkových bytů, aby délka skupinové položky byla dělitelná dvěma resp. čtyřmi resp. osmi (podle "nejpřísnějšího" zarovnání požadovaného pro podřízené položky). Příklad: 01 A. 02 B PIC X. 02 C. 03 D PIC S9(9) COMP SYNC. 03 E PIC X. 03 F PIC S9(4) COMP SYNC. 03 G PIC X. 02 H COMP-1 SYNC. 01 I PIC XXX. výplňkové byty (1-4,9-10,13-16,20-24) 0 2 4 6 8 10 12 14 16 18 20 22 24 27 |-----| |-| |-----| |-------| | |-|-----|-------|-|-|---|-|-----|-------|-------|-----| |B| |---D---|E| |-F-|G| |---H---| |--I--| | |--------C--------| | |-------------------A-------------------| Podstatné zde je, že položka C začíná až na začátku položky D (a nikoliv už za koncem položky B) a končí už na konci položky G (a nikoliv až na začátku položky H), a podobně, že položka A končí už na konci položky H (a nikoliv až na začátku položky I). Příklad: 01 A. 02 B OCCURS 2. 03 C COMP-1 SYNC. 03 D PIC XX. výplňkové byty (6-8,14-16) 0 2 4 6 8 10 12 14 16 |-----| |-----| |-----------|-----|-----|-----------|-----|-----| |---C(1)----|D(1)-| |---C(2)----|D(2)-| | |---------B(1)----------|---------B(2)----------| |-----------------------A-----------------------| Položka C vyžaduje zarovnání na adresu dělitelnou čtyřmi. Protože položka D nekončí na adrese dělitelné čtyřmi, přidávají se za každou položku D dva výplňkové byty, které se zahrnují do nadřízené skupinové položky B. Podstatné zde tedy je, že položka B(1) končí až na začátku položky C(2) resp. B(2) (a nikoliv již na konci své poslední podřízené elementární položky D(1)), takže zahrnuje i výplňkové byty mezi položkami D(1) a C(2); podobně položka B(2) zahrnuje výplňkové byty přidané za položku D(2). Položka A končí na konci své poslední bezprostředně podřízené položky B(2), rovněž tedy zahrnuje výplňkové byty přidané za položku D(2). Příklad: 01 A. 02 B OCCURS 2. 03 C PIC S9999 COMP SYNC. 03 D PIC XXX. 01 E PIC XXX. výplňkové byty (5-6 a 11-12 kvůli OCCURS, 12-16 kvůli 01) 0 1 2 3 4 5 6 7 8 9 10 11 12 16 19 |--| |--|-----------| |-----|--------|--|-----|--------|--|-----------|--------| |C(1)-|--D(1)--| |C(2)-|--D(2)--| | |---E----| |-------B(1)------|-------B(2)------| |-----------------A-----------------| Za každou položku D se přidává jeden výplňkový byte, který se započítává do položky B, aby byla délka položky B sudá. Před začátek položky E se přidávají další 4 výplňkové byty, aby byla adresa položky E dělitelná osmi. Mezi položkami D(2) a E tedy vzniká celkem 5 výplňkových bytů, z nichž se však pouze první (zařazený na základě výjimky při pravidle 3 výše) zahrnuje do nadřízených položek B(2) a A. 4) Má-li překladač zarovnávat adresu položky stojící ve struktuře za položkou s klauzulí OCCURS DEPENDING (tj. za polem proměnné délky), přidávají se výplňkové byty tak, jakoby počet opakování byl roven nule. Příklad: 01 A. 02 B PIC X. 02 C PIC 9 OCCURS 23 DEPENDING I. 02 D PIC XXXX. 02 E COMP-1 SYNC. Mezi položkami D a E budou vynechány tři výplňkové byty (stejně jakoby byl popis položky C s OCCURS DEPENDING vynechán). Rozdíl adres položek E a A bude tedy dělitelný čtyřmi pouze při hodnotách I = 0, 4, 8, 12, ... 5) Má-li se zarovnávat adresa položky s klauzulí REDEFINES, bere se nejbližší zarovnaná adresa počínaje adresou položky uvedené v klauzuli REDEFINES (není-li v klauzuli REDEFINES uvedeno jméno redefinované položky, předpokládá se poslední z redefinovatelných položek). Při vícenásobné redefinici může tedy teoreticky záležet na tom, jméno které z předcházejících redefinovatelných položek uvedeme v klauzuli REDEFINES. Příklad: 01 A. 02 B PIC X. 02 C PIC X(15). (C začíná na A+1) 02 D REDEFINES C PIC 9 COMP SYNC. (D začíná na A+2) 02 E REDEFINES C PIC X. (E začíná na A+1 jako C) 02 F REDEFINES D PIC X. (F začíná na A+2 jako D) 02 G REDEFINES C COMP-2 SYNC. (G začíná na A+8) 02 H REDEFINES PIC X. (H začíná na A+8 jako G) 02 I REDEFINES D. (I začíná na A+4 jako J) 03 J COMP-1 SYNC. (J začíná na A+4) 02 K REDEFINES. (K začíná na A+4 jako L) 03 L PIC X. (L začíná na A+4 jako I) 02 M REDEFINES C. (M začíná na A+8 jako N) 03 N COMP-2 SYNC. (N začíná na A+8) 02 P REDEFINES C. (P začíná na A+2 jako Q) 03 Q PIC S9999 COMP SYNC. (Q začíná na A+2) 03 R COMP-2 SYNC. (R začíná na A+8) 02 S REDEFINES H. (S začíná na A+8 jako T) 03 T INDEX SYNC. (T začíná na A+8 jako H) Poznámky: 1) Překladač nezajišťuje žádný počáteční obsah výplňkových bytů (nemá-li ovšem nadřízená nebo redefinovaná resp. redefinující položka klauzuli VALUE). 2) I když strojové instrukce nevyžadují zarovnání adres operandů, přesto pracují při zarovnaných adresách (alespoň na sudou adresu) většinou rychleji, takže použití klauzule SYNC (resp. CBL ALIGN) a výplňkových bytů může zrychlit výpočet. Dále mohou výplňkové byty sloužit k tomu, aby struktura 01 odpovídala struktuře logických vět zpracovávaného souboru dat (neboli struktuře 01 při vytváření tohoto souboru dat); v tom případě je však rozumné nenechat vzniknout uvnitř 01 při vytváření ani při zpracovávání výplňkové byty a raději si v rámci 01 popsat explicitně FILLERy. 4.11. Položky definované překladačem Překladač definuje automaticky některé položky sloužící ke zvláštním účelům. Uživatel již tyto položky nesmí popisovat, přesto je však může používat, a to buďto v kterémkoliv příkazu nebo klauzuli (týká se položek TALLY, WHEN-COMPILED, NSTD-REELS a položek pro Generátor sestav a pro třídění) nebo pouze v příkazech MOVE a CALL a v klauzuli SOURCE (týká se CURRENT-DATE, TODAYS-DATE, TIME-OF-DAY, COM-REG a RETURN-CODE). Jedná se o položky s těmito jmény: 1) TALLY Položka TALLY označuje jeden "long" v přeloženém programu s implicitně přijatým popisem 77 TALLY PIC S9(9) USAGE COMP VALUE 0. Uživatel smí použít položku TALLY všude tam, kde formát povoluje položku s takovýmto popisem. Mimoto je položka TALLY naplňována pomocí příkazu EXAMINE s klauzulí TALLYING, při zadání parametru CBL TALLY pomocí příkazů READ a RETURN při RECORDING V nebo U a pomocí některých uživatelských podprogramů dodávaných spolu s překladačem (ICVERIF, ICGEN, ICDAY atd.). 2) CURRENT-DATE a TODAYS-DATE Jména CURRENT-DATE a TODAYS-DATE jsou ekvivalentní a označují touž položku definovanou překladačem; kvůli kompatibilitě je však vhodnější používat jméno CURRENT-DATE. Uživatel smí použít položku CURRENT-DATE (TODAYS-DATE) jedině jako vysílající položku v příkazu MOVE nebo v klauzuli SOURCE anebo jako argument v příkazu CALL. Položka CURRENT-DATE (TODAYS-DATE) označuje osmibytové pole, na němž je umístěno datum výpočtu ve tvaru dd/mm/rr (dd je den, mm je měsíc, rr jsou poslední dvě číslice roku; např. 17.listopadu 1989 měla položka CURRENT-DATE obsah 17/11/89). Položka CURRENT-DATE má implicitně přijatý popis 77 CURRENT-DATE PIC X(8). 3) TIME-OF-DAY Uživatel smí použít položku TIME-OF-DAY jedině jako vysílající položku v příkazu MOVE nebo v klauzuli SOURCE nebo jako argument v příkazu CALL. Položka TIME-OF-DAY označuje šestibytové pole, na němž je uložen okamžitý čas (tj. čas provádění příkazu MOVE/CALL resp. čas realizace klauzule SOURCE, v nichž je položka TIME-OF-DAY uvedena) ve tvaru hhmmvv (znakově; hh jsou hodiny, mm minuty a vv vteřiny; např. v 5 hodin 48 minut 9 vteřin bude mít položka TIME-OF-DAY obsah 054809). Položka TIME-OF-DAY má implicitně přijatý popis 77 TIME-OF-DAY PIC 9(6). 4) WHEN-COMPILED Položka WHEN-COMPILED označuje 16 bytů v přeloženém programu, na nichž je uloženo datum a čas platné při začátku překladu zdrojového programu ve tvaru dd/mm/rrhh:mm:vv (např. začal-li se zdrojový program překládat 7.března 1990 v 9 hodin 56 minut 5 vteřin, bude mít položka WHEN-COMPILED umístěná v přeloženém programu počáteční obsah 07/03/9009:56:05). Položka WHEN-COMPILED má implicitně přijatý popis 77 WHEN-COMPILED PIC X(16) VALUE 'dd/mm/rrhh:mm:vv'. Uživatel smí použít položku WHEN-COMPILED všude tam, kde formát povoluje položku s takovýmto popisem (smí ji tedy i změnit). Položka WHEN-COMPILED je určena především pro vytisknutí v hlavičkách tiskových sestav, aby bylo možné později zjistit, pomocí které verse cobolského programu byla ta která tisková sestava vlastně vytisknuta. 5) COM-REG Položka COM-REG označuje 11-bytovou oblast nacházející se v souboru MXCOMREG.COB na řádku, začínajícím textem USAREA=. První byte položky COM-REG je bezprostředně za tímto textem. Uživatel může měnit editorem v souboru MXCOMREG.COB obsah položky COM-REG, a tak předávat do přeloženého programu vhodný parametr. V položce COM-REG si také mohou předávat informace po sobě pracující programy. Uživatel smí použít položku COM-REG pouze následujícími dvěma způsoby: a) Jako vysílající položku v příkazu MOVE nebo v klauzuli SOURCE anebo jako argument v příkazu CALL. V tom případě se položka COM-REG zpracovává, jakoby měla implicitně přijatý popis "77 COM-REG PIC X(11).". b) Jako příjmovou položku v příkazu MOVE. V tom případě musí být vysílajícím údajem položka nebo alfanumerický literál o délce alespoň 11 bytů (překladač však délku vysílajícího údaje nekontroluje). Příkaz MOVE pracuje tak, že prvních 11 bytů od začátku vysílajícího údaje přesune alfanumericky bez jakékoliv úpravy do 11-bytové oblasti souboru MXCOMREG.COB odpovídající položce COM-REG. 6) NSTD-REELS Položka NSTD-REELS označuje jeden "short" v přeloženém programu s implicitně přijatým popisem 77 NSTD-REELS PIC S999 USAGE COMP VALUE 0. Uživatel smí použít položku NSTD-REELS všude tam, kde formát povoluje použít položku s takovýmto popisem. Vzhledem k tomu, že tento COBOL nepracuje s magnetopáskovými soubory bez návěští nebo s nestandardními návěštími, nemá položka NSTD-REELS žádné "implicitní" využití a je implementována pouze kvůli kompatibilitě; doporučujeme ji nevyužívat. 7) LINE-COUNTER, PAGE-COUNTER, PRINT-SWITCH a CBL-CTR Tyto položky označují čítače a indikátory vytvářené Generátorem sestav a jsou popsány v 13.2. 8) SORT-FILE-SIZE,SORT-CORE-SIZE,SORT-MODE-SIZE,SORT-RETURN Tyto položky se používají při třídění a jsou popsány v 14.9. 9) RETURN-CODE Položka RETURN-CODE má implicitně přijatý popis 77 RETURN-CODE PIC S9(9) USAGE COMP. Její hodnota je uchovávána v souboru MXCOMREG.COB na řádku začínajícím textem RETURN-CODE=. Bezprostředně za rovnítkem následuje případné znaménko - a 1 až 9 cifer. Hodnotu této položky lze měnit buď editorem nebo v programu příkazem MOVE. Položku RETURN-CODE lze použít pro předávání numerické hodnoty programu nebo pro komunikaci mezi programy. Uživatel smí použít položku RETURN-CODE pouze jako vysílající položku v příkazu MOVE nebo v klauzuli SOURCE anebo jako argument v příkazu CALL, a dále jako příjmovou položku v příkazu MOVE; v tom případě však musí být vysílajícím údajem celočíselný numerický literál s nejvýše 9 ciframi nebo celočíselná numerická položka. 10) DATE, DAY a TIME Tato reservovaná slova nepředstavují položky definované překladačem, nýbrž se používají ve zvláštním formátu příkazu ACCEPT (viz 9.4.). 4.11.1 Soubor MXCOMREG.COB Soubor MXCOMREG.COB je textový soubor, obsahující hodnoty položek RETURN-CODE, UPSI, USAREA a DEBUG. Tyto položky se v operačním systému DOS-3 nacházely v oblasti COMREG, která ležela mimo paměť přidělenou uživatelským programům. Položka DEBUG odpovídá druhému bytu pole IQCOMSPM, který byl nastavován příkazem // OPTION SYSPARM='D', pro navození testovacího režimu při provádění cobolského programu. Hodnoty položek RETURN-CODE, UPSI a USAREA mohly být měněny a testovány jak z uživatelských programů, tak i pomocí příkazů pro řízení úloh (UPSI, MIF, USAREA, ...). Jelikož v operačních systémech MS-DOS a UNIX podobná komunikační oblast neexistuje, byl zřízen soubor MXCOMREG.COB. Tento soubor může vytvořit uživatel pomocí editoru, nebo jej vytvoří cobolský program sám při prvním odkazu na některou z položek RETURN-CODE, UPSI nebo USAREA. Při vytváření souboru cobolským programem jsou položky RETURN-CODE a UPSI vynulovány a položky USAREA a DEBUG vymezerovány. Soubor MXCOMREG.COB je hledán a případně vytvářen v tom adresáři, který je v okamžiku spouštění cobolského programu aktuálním adresářem. Hodnoty položek RETURN-CODE a UPSI jsou v souboru MXCOMREG.COB uchovávány ve znakovém (čitelném) tvaru, aby si je uživatel mohl lehce prohlédnout a případně editorem změnit. Cobolský program si tyto hodnoty převádí při běhu do binárního tvaru, takže pracuje s položkou RETURN-CODE jako s binární položkou o délce 4 byty. Soubor MXCOMREG.COB obsahuje 4 řádky s hodnotami položek RETURN-CODE, UPSI, USAREA a DEBUG. Na těchto řádcích je hned za jménem položky uvedeno =, za nímž bezprostředně následuje hodnota položky. Je-li hodnota položky RETURN-CODE záporná, je za znakem = uvedeno znaménko -. Hodnota UPSI se zadává binárně. Kvůli přehlednosti je povoleno vkládat mezi binární nuly a jedničky libovolně mezery. Kromě těchto čtyř řádků s hodnotami, může soubor MXCOMREG.COB obsahovat ještě libovolný počet poznámkových řádků. Jsou to buď prázdné řádky, nebo řádky začínající hvězdičkou. Při jakékoliv práci s položkami RETURN-CODE, UPSI nebo COM-REG (USAREA) je vždy nejprve obsah souboru MXCOMREG.COB načten do paměti a po případné změně je zase uložen zpět na disk. Pomocí souboru MXCOMREG.COB může uživatel komunikovat se spuštěným programem.