6.12. Příkaz INITIALIZE Příkaz INITIALIZE umožňuje poslat do všech (anebo jen do některých) elementárních položek podřízených k zadané skupinové položce určitou hodnotu. Dále příkaz INITIALIZE umožňuje poslat určitou hodnotu do všech prvků zadaného indexovaného pole. Formát 1: - - - - položka - - | | BY | | literál | | INITIALIZE položka ... |REPLACING < > < fig.konst. > | | | WITH | | ALL-klauzule| | - - - - - - Formát 2: INITIALIZE položka ... REPLACING - - ALPHANUMERIC - - - - položka - - | | NUMERIC | | BY | | literál | | < < ALPHANUMERIC-EDITED> DATA < > < fig.konstanta> > ... | | NUMERIC-EDITED | |WITH | | ALL-klauzule | | - - - - - - - - Pravidla: V obou formátech je za slovem INITIALIZE uvedena buďto jedna příjmová položka nebo několik příjmových položek. Je-li v příkazu uvedeno několik příjmových položek, zpracovávají se tyto postupně přesně tak, jako kdyby byl pro každou z nich uveden zvláštní příkaz INITIALIZE s touž klauzulí REPLACING, která je použita v uvedeném příkazu. Příjmová položka může být následujících typů: a) Elementární položka. Smí mít klauzuli REDEFINES anebo být podřízena položce s klauzulí REDEFINES, smí mít klauzuli RENAMES, nesmí však mít USAGE INDEX. V tomto případě se dále popsaná akce provádí pouze pro tuto položku. b) Skupinová položka. V tomto případě se dále popsaná akce provádí pro všechny její podřízené elementární položky s těmito výjimkami: - Vylučují se položky se jménem FILLER (nevylučují se však elementární položky podřízené položce se jménem FILLER, pokud samy mají jméno různé od FILLER). - Vylučují se položky s klauzulí REDEFINES a též položky podřízené takové položce s klauzulí REDEFINES, která je sama podřízena příjmové položce uvedené v příkazu INITIALIZE (nevadí však, je-li klauzule REDEFINES uvedena u příjmové položky uvedené v příkazu INITIALIZE anebo u některé její nadřízené položky). - Vylučují se položky s čísly úrovně 66 (tzn. s klauzulí RENAMES). - Vylučují se položky s USAGE INDEX. Nevylučují se položky s klauzulí OCCURS ani položky podřízené položce s klauzulí OCCURS. V takovémto případě se příslušná akce bude provádět pro všechny prvky podřízeného indexovaného pole (počet těchto prvků smí být pevný nebo i proměnný). U příkazu INITIALIZE existuje důležitá výjimka proti všem ostatním příkazům jazyka COBOL: U položky, která má klauzuli OCCURS anebo která je podřízena položce s klauzulí OCCURS, je přípustné místo kteréhokoliv indexu (jednoho nebo i více) uvést rezervované slovo ALL. Pokud by takto měl seznam indexů končit jedním nebo několika slovy ALL, lze tato koncová slova ALL vynechat a uvést u položky tedy méně indexů, než kolik klauzulí OCCURS se k ní vztahuje. Pokud by všechny indexy měly být nahrazeny slovy ALL, lze všechna tato slova ALL vynechat i s kulatými závorkami a zapsat do příkazu položku zcela bez indexů. Příklad: K položce T se vztahuje 5 klauzulí OCCURS (takže ve všech příkazech mimo INITIALIZE, SEARCH, CALL 'ICSORT', CALL 'ICSORTM' a CALL 'ICSORTP' je nutné u ní uvádět pět indexů). V příkazu INITIALIZE smí být položka T zapsána např. takto: T (I ALL 4 ALL J) T (ALL I J ALL ALL) ekvivalentní s T(ALL I J) T (I ALL ALL ALL ALL) ekvivalentní s T (I) T (ALL ALL ALL ALL ALL) ekvivalentní s T Z uvedeného vyplývá, že je přípustné vynechat buďto všechny indexy anebo několik posledních indexů; pokud si však přejeme první indexy vynechat a poslední indexy uvést, musíme použít slovo ALL. Je-li u položky uveden menší počet indexů než kolik klauzulí OCCURS se k ní vztahuje, musí se tyto uvedené indexy týkat prvních (tj. "vnějších") klauzulí OCCURS, zatímco vynechané indexy se musí týkat posledních (tj. "vnitřních") klauzulí OCCURS. Je-li místo indexu uvedeno slovo ALL (resp. je-li index jakožto koncový zcela vynechán), zastupuje pak zápis položky všechna opakování této položky vzhledem k tomuto indexu. Dále popsaná akce se tedy bude provádět pro všechna opakování uvedené položky vzhledem ke všem indexům nahrazeným pomocí slova ALL nebo vynechaným (v případě OCCURS DEPENDING se jako počet opakování bere okamžitá hodnota položky uvedené za slovem DEPENDING). Ty indexy, které jsou u položky explicitně uvedené, budou v nezměněném tvaru použity též pro všechna tato opakování. Je-li příjmová položka uvedená v příkazu INITIALIZE skupinová, bude se dále popsaná akce provádět ve všech těchto opakováních pro všechny podřízené elementární položky, které vyhovují pravidlům z bodu b). Ve formátu 2 se mimo položky vyloučené bodem b) vylučují navíc ještě ty elementární položky, které nepatří k žádnému z uvedených typů (viz dále). Příklad: 01 A. 02 B PIC 999. 02 C OCCURS 10 DEPENDING I. 03 D PIC X. 03 FILLER PIC X. 03 E OCCURS 2. 04 F PIC XXX. 04 G PIC 999. 04 H REDEFINES G PIC XXX. Předpokládejme např. I = 3. Následující přehled ukazuje, pro které položky se bude provádět dále popsaná akce při určitých zápisech příjmové položky: INITIALIZE A ...B, D(1), F(1 1), G(1 1), F(1 2), G(1 2), D(2), F(2 1), G(2 1), F(2 2), G(2 2), D(3), F(3 1), G(3 1), F(3 2), G(3 2) INITIALIZE B ...pouze pro B INITIALIZE C ...jako při INITIALIZE A, avšak bez B INITIALIZE C(K) ...D(K), F(K 1), G(K 1), F(K 2), G(K 2) INITIALIZE D ...D(1), D(2), D(3) INITIALIZE D(K) ...pouze pro D(K) INITIALIZE E ...F(1 1), G(1 1), F(1 2), G(1 2), F(2 1), G(2 1), F(2 2), G(2 2), F(3 1), G(3 1), F(3 2), G(3 2) INITIALIZE E(K) ...F(K 1), G(K 1), F(K 2), G(K 2) INITIALIZE E(ALL J) ...F(1 J), G(1 J), F(2 J), G(2 J), F(3 J), G(3 J) INITIALIZE E(K J) ...F(K J), G(K J) INITIALIZE F ...F(1 1), F(1 2), F(2 1), F(2 2), F(3 1), F(3 2) INITIALIZE F(K) ...F(K 1), F(K 2) INITIALIZE F(ALL J) ...F(1 J), F(2 J), F(3 J) INITIALIZE F(K J) ...pouze pro F(K J) INITIALIZE H ...H(1 1), H(1 2), H(2 1), H(2 2), H(3 1), H(3 2) Pravidla: Akce, které se budou provádět pro elementární položky určené výše popsanými pravidly, jsou definovány takto: a) Při formátu 1 bez klauzule REPLACING se do všech příslušných elementárních položek pošle SPACE (pro alfanumerické a alfanumerické editované položky) resp. ZERO (pro numerické položky včetně numerických editovaných položek). b) Při formátu 1 s klauzulí REPLACING se do všech příslušných elementárních položek pošle argument uvedený za slovem BY resp. WITH (tento argument se posílá do všech příslušných elementárních položek nezávisle na tom, jakého jsou typu). c) Při formátu 2 je za (nepovinným) slovem REPLACING uvedena jedna nebo několik klauzulí obsahujících vždy název určitého typu a dále argument (za slovem BY resp. WITH). Názvy typů v jednotlivých uvedených klauzulích musí být různé (lze tedy uvést nejvýše 4 tyto klauzule, tj. pro každý z možných typů jednu). Každá z těchto klauzulí způsobí, že se do všech příslušných elementárních položek (určených výše popsanými pravidly), které navíc jsou uvedeného typu, pošle argument uvedený v této klauzuli za slovem BY resp. WITH. Ty elementární položky, které nepatří k žádnému z typů uvedených v některé z klauzulí, budou přeskočeny a zůstanou beze změny. Jednotlivé názvy typů mají tyto významy: ALPHANUMERIC ... alfanumerické položky (včetně tzv. alfabetických položek) NUMERIC ... numerické položky s výjimkou numerických editovaných položek ALPHANUMERIC-EDITED ... alfanumerické editované položky NUMERIC-EDITED ... numerické editované položky Poznámka: Formát 2 umožňuje poslat jinou hodnotu do alfanumerických položek a jinou hodnotu do numerických položek nebo poslat určitou hodnotu pouze do numerických položek a přitom alfanumerické položky ponechat beze změny atd. Pokud bychom si přáli poslat určitou hodnotu jen do některých numerických položek a ostatní numerické položky ponechat beze změny, musíme buďto zařídit, aby tyto ostatní numerické položky měly buďto jméno FILLER nebo klauzuli REDEFINES a byly tedy z naplňování vyloučeny, např. takto: 01 M. 02 N OCCURS 100. 03 P PIC 9(4). (naplňuje se) 03 FILLER PIC 9(5). (vylučuje se) 03 Q REDEFINES PIC 9(5). (vylučuje se) 03 R PIC 9(7). (naplňuje se) ... INITIALIZE M BY 1. anebo musíme použít několik příkazů INITIALIZE (stejně i v případě, chceme-li do různých numerických položek poslat různé argumenty). Pravidla (společná pro oba formáty): 1) Slova BY a WITH mají přesně stejný význam. 2) Slova REPLACING a DATA jsou nepovinná a bezvýznamná. 3) Všechny přesuny se provádějí dle pravidel příkazu MOVE. 4) Jediné omezení kladené na argument uvedený za slovem BY resp. WITH je, že všechny přesuny do všech elementárních položek, do nichž bude tento argument přesunován, musí být přípustné. Příklad: Při popisech z minulého příkladu bude mít příkaz INITIALIZE A stejný účinek jako příkazy MOVE SPACE TO D(1) F(1 1) F(1 2) D(2) F(2 1) F(2 2) D(3) F(3 1) F(3 2) MOVE ZERO TO B G(1 1) G(1 2) G(2 1) G(2 2) G(3 1) G(3 2) Příklad: Je-li ALFA skupinová položka, pak příkaz INITIALIZE ALFA NUMERIC BY 24 pošle literál 24 do všech numerických položek podřízených položce ALFA, které vyhovují pravidlům uvedeným v bodě b) a nejsou numerické editované. Podřízené položky, které jsou alfanumerické, alfanumerické editované nebo numerické editované, a dále též položky nevyhovující pravidlům uvedeným v bodě b), se nezmění. Příklad: 01 A. 02 B OCCURS 20. 03 C PIC S999 COMP-3 OCCURS 100. Příkaz INITIALIZE A pošle ZERO do všech položek C(1 1), C(1 2), ..., C(20 100). Bude mít tedy stejný účinek jako příkaz MOVE ALL #0003# TO A. Příkaz INITIALIZE A BY T pošle do všech položek C(1 1), C(1 2), ..., C(20 100) položku T. Příkaz INITIALIZE B(9) B(K) BY 5 pošle do položek C(9 1), C(9 2), ..., C(9 100), C(K 1), C(K 2), ..., C(K 100) literál 5. Poznámka: Příkaz INITIALIZE se překládá pomocí příkazů MOVE, takže přesuny v příkazu INITIALIZE jsou stejně efektivní, jako kdyby programátor napsal pro každou naplňovanou elementární položku zvláštní příkaz MOVE. Naplňování příjmové elementární položky s klauzulí OCCURS se provádí efektivněji, než kdyby programátor naplňoval příjmovou položku v cyklu se změnou speciálního indexu.