6.11. Příkazy s klauzulí CORRESPONDING Klauzule CORRESPONDING může být uvedena u příkazů MOVE, ADD a SUBTRACT. Způsobí, že příslušná operace se bude provádět nikoliv pro položky uvedené v příkazu, nýbrž pro některé jejich podřízené položky. Formát: MOVE { CORRESPONDING | CORR } skupinová-položka-1 TO skupinová-položka-2 ... ADD { CORRESPONDING | CORR } skupinová-položka-1 TO { skupinová-položka-2 [ROUNDED] } ... [ON SIZE ERROR příkaz ... ] SUBTRACT { CORRESPONDING | CORR } skupinová-položka-1 FROM { skupinová-položka-2 [ROUNDED] } ... [ON SIZE ERROR příkaz ... ] Poznámka: Slova CORRESPONDING a CORR jsou ekvivalentní. Funkce: Příslušná operace (tj. přesun, přičtení resp. odečtení) se bude provádět postupně pro všechny dvojice položek, z nichž první je podřízena položce-1 (uvedené za slovem CORRESPONDING resp. CORR) a druhá je podřízena položce-2 (uvedené za slovem TO resp. FROM), pokud tyto dvě položky splňují následující podmínky: 1) Obě položky mají stejná jména, přičemž toto společné jméno není FILLER. 2) Obě položky mají stejnou tzv. "úplnou kvalifikační řadu" až k položce-1 resp. položce-2. Tím je míněno, že počet položek podřízených položce-1 a současně nadřízených první položce z dvojice je roven počtu položek podřízených položce-2 a současně nadřízených druhé položce z dvojice, přičemž položky na odpovídajících si místech obou těchto úplných kvalifikačních řad mají stejná jména (nemusí mít ovšem stejná čísla úrovně). 3) Žádná z obou položek ve dvojici ani žádná z jejich nadřízených položek, která je současně podřízena položce-1 resp. položce-2 nemá žádnou z klauzulí REDEFINES, OCCURS nebo RENAMES ani jméno FILLER. Žádná z obou položek nesmí mít USAGE INDEX. (Naproti tomu položka-1, položka-2 i všechny položky jim nadřízené smí mít klauzule REDEFINES nebo OCCURS, nikoliv ovšem RENAMES. Položky nadřízené k položce-1 nebo k položce-2 smí mít jméno FILLER.) 4) Pouze pro MOVE: alespoň jedna z obou položek musí být elementární. 5) Pouze pro ADD a SUBTRACT: obě položky musí být elementární a to numerické. Dvě položky splňující tato pravidla nazýváme "sdružené". Poznámky: 1) U příkazů ADD a SUBTRACT s klauzulí CORRESPONDING se může stát, že jedna nebo obě položky z dvojice sdružených položek budou numerické editované a bude tedy pro ně provedena příslušná operace přičítání resp. odečítání (neboť v MX COBOLu se numerické editované položky počítají mezi numerické položky). V některých jiných implementacích jazyka COBOL, v nichž numerické editované položky nepatří mezi numerické položky, by takovéto dvojice byly vyloučeny. 2) Za slovem TO resp. FROM může být uvedeno i několik příjmových položek-2. Pak příkaz má stejný význam jako několik příkazů s touž položkou-1 a vždy s jedinou položkou-2. Např. příkaz ADD CORR A TO B C ROUNDED D je ekvivalentní s třemi příkazy ADD CORR A TO B ADD CORR A TO C ROUNDED ADD CORR A TO D 3) Pouze pro ADD a SUBTRACT: Za každou z položek-2 smí být uvedeno slovo ROUNDED, které způsobí, že u všech dílčích přičtení resp. odečtení odpovídajících této položce-2 bude prováděno zaokrouhlení. 4) Položky podřízené položce-2, k nimž nebyla nalezena žádná sdružená položka, zůstanou beze změny (nezmění-li se ovšem v důsledku změn položek nadřízených nebo redefinovaných). 5) Při překladu příkazu s klauzulí CORRESPONDING prochází překladač postupně všechny položky podřízené položce-1 a u každé z nich zkoumá, zda k ní mezi položkami podřízenými k položce-2 existuje položka sdružená. Kdyby k ní našel sdružených položek (vyhovujících všem výše uvedeným pravidlům) více, ohlásí chybu. Naproti tomu však překladač nekontroluje, zda s několika položkami podřízenými položce-1 není sdružena táž položka podřízená položce-2. Pokud překladač nalezne ke skupinové položce podřízené položce-1 odpovídající stejnojmennou skupinovou položku podřízenou položce-2 (takže by tyto položky mohly být sdružené, kdyby alespoň jedna z nich byla elementární) pokračuje samozřejmě v hledání sdružených položek pro položky podřízené dané skupinové vysílající položce, ale tyto sdružené položky hledá jen mezi podřízenými položkami nalezené skupinové příjmové položky. Mějme např. následující struktury: 01 PRVNI. 01 DRUHA. 05 A. 02 A. 10 X PIC X. 03 X PIC X. 10 Y PIC 9. 03 Y PIC 9. 10 Z PIC 9. 02 A. 03 Z PIC 9. Příkaz ADD CORR PRVNI TO DRUHA přičte položku Y OF PRVNI k položce Y OF DRUHA, ale nepřičte položku Z, protože k položce A OF PRVNI našel překladač odpovídající (první) položku A OF DRUHA a mezi jejími podřízenými položkami není žádná položka Z. Psaní nejednoznačných jmen do struktur je podezřelá praktika (obě položky A OF DRUHA by měly být sloučeny do jedné položky, jako je tomu u položky A OF PRVNI) a některé implementace jazyka COBOL ji zakazují. 6) Použití klauzule CORRESPONDING může být za určitých okolností výhodné (i když je nebezpečí v tom, že mohou být ve skutečnosti vybrány jiné dvojice sdružených položek, než jak uživatel mylně předpokládal). Nepříjemným důsledkem však je, že pak jsou ve zdrojovém programu dvojice položek se stejnými jmény, takže ve všech ostatních příkazech je nutno tyto položky používat pouze s kvalifikací. Používání kvalifikace však bývá častým zdrojem chyb, způsobuje nepřehlednost programu a ztěžuje ladění. 7) Pouze pro ADD a SUBTRACT: Význam klauzule ON SIZE ERROR je popsán v 6.4. Příklad: 02 A. 04 B. 06 C PIC 99. 06 D REDEFINES C PIC 9V9. 06 E PIC 9. 04 F. 07 G PIC 9. 07 H PIC 9999. 07 I PIC S9V99. 04 J PIC 999. ... 03 K. 05 J. 07 L PIC 9 OCCURS 10. 05 F. 06 I PIC S99V9 COMP-3. 06 M PIC 99. 06 G PIC S99. 05 H PIC 9999. 05 B. 08 D PIC 9V9. 08 E PIC X. 08 C PIC 99V99 COMP. Příkaz "MOVE CORR A TO K" má stejný význam jako příkazy MOVE C OF A TO C OF K MOVE E OF A TO E OF K MOVE G OF A TO G OF K MOVE I OF A TO I OF K MOVE J OF A TO J OF K (Položka D OF A má klauzuli REDEFINES, položky H OF A a H OF K mají jinou úplnou kvalifikační řadu.) Příkaz "ADD CORR A TO K" má stejný význam jako příkazy ADD C OF A TO C OF K ADD G OF A TO G OF K ADD I OF A TO I OF K (Položky E OF K a J OF K nejsou numerické) Příkaz "SUBTRACT CORR F OF K FROM F IN A ROUNDED" má stejný význam jako příkazy SUBTRACT I OF K FROM I OF A ROUNDED SUBTRACT G OF K FROM G OF A ROUNDED Příklad: 02 A OCCURS 10. 03 FILLER PIC X. 03 B PIC XXX. 03 C PIC S999 COMP-3. ... 04 FILLER OCCURS 5. 05 E OCCURS 8. 07 C PIC ZZZ9. 07 FILLER PIC XX. 07 B PIC XBBXBBX. Příkaz "MOVE CORR A(I) TO B OF E (J 3)" má stejný význam jako příkazy MOVE B OF A (I) TO B OF E (J 3) MOVE C OF A (I) TO C OF E (J 3)