17.20. ICVIRF Funkce: Podprogram ICVIRF uvolní (zruší) úsek paměti přidělený položce z LINKAGE SECTION předchozím vyvoláním podprogramu ICVIRG. Pokud při tomto volání podprogramu ICVIRG nebyla uvedena dispozice 'READ', zapíše ještě předtím obsah tohoto úseku paměti do souboru zadaného ve volání podprogramu ICVIRG. Činnost podprogramu ICVIRF je v zásadě popsána u podprogramu ICVIRG (17.19.), zde proto uvedeme jen několik formálních pravidel. Způsob volání: CALL 'ICVIRF' USING položka [délka] Pravidla: Položka uvedená za USING musí být popsána v LINKAGE SECTION (nebo teoreticky ve FILE SECTION) s číslem úrovně 01 nebo 77. Smí to být výhradně jen taková položka, které byl v průběhu předešlého výpočtu přidělen úsek paměti pomocí podprogramu ICVIRG, přičemž toto přidělení nebylo během dalšího výpočtu změněno ani zrušeno dřívějším vyvoláním podprogramu ICVIRF (v takovém případě bude příkaz CALL 'ICVIRF' neúčinný, doporučujeme však tuto možnost nevyužívat). Druhý argument "délka" je nepovinný; smí to být celé číslo nebo celočíselná numerická položka nebo speciální index nebo položka s USAGE INDEX s nezápornou hodnotou nejvýše 65504 bytů. Význam tohoto argumentu záleží na dispozici uvedené v odpovídajícím příkazu CALL 'ICVIRG': a) Byla-li v příkazu CALL 'ICVIRG' uvedena dispozice 'WRITE' nebo 'APPEND', lze pomocí parametru "délka" zadat opravenou (zkrácenou) délku úseku paměti, jenž má být zapsán do souboru. Je-li hodnota argumentu "délka" nejvýše rovna délce úseku paměti vyhrazeného podprogramem ICVIRG, bude do souboru zapsáno pouze tolik bytů tohoto úseku, kolik činí hodnota argumentu "délka". Je-li tato hodnota větší než délka vyhrazeného úseku paměti, argument "délka" se neuplatní a do souboru se zapíše úsek paměti ve své plné délce (zadané voláním podprogramu ICVIRG). Implicitní délka prvního argumentu se při uvedení druhého argumentu "délka" ignoruje. b) Byla-li v příkazu CALL 'ICVIRG' uvedena dispozice 'WRITE' nebo 'APPEND' a druhý argument "délka" není uveden, použije se místo něj implicitní délka položky uvedené jako první argument za CALL 'ICVIRF' USING; do souboru se tedy zapisuje tolik bytů vyhrazeného úseku paměti, kolik činí minimum z délky úseku paměti vyhrazeného podprogramem ICVIRG a okamžité délky položky uvedené za CALL 'ICVIRF' USING. c) Byla-li v příkazu CALL 'ICVIRG' uvedena dispozice 'READ' nebo 'UPDATE', druhý argument "délka" se ignoruje a rovněž tak se ignoruje i implicitní délka položky uvedené za CALL 'ICVIRF' USING. Při dispozici 'UPDATE' se vždy do souboru zapisuje celý vyhrazený úsek paměti (tj. o délce rovné minimu z délky zadané voláním podprogramu ICVIRG a z plné délky zadaného souboru). Po případném zápisu obsahu úseku paměti do souboru podprogram ICVIRF tento úsek paměti zruší a vynuluje ukazatel přidělený položce uvedené za USING; platí zde stejná pravidla jako u podprogramu ICUGETV (viz 17.5.). Poznámka: Znovu upozorňujeme, že na rozdíl od COBOLu DOS-3 je v MX COBOLu (s výjimkou dispozice 'READ') explicitní vyvolání podprogramu ICVIRF nezbytné pro zápis obsahu úseku paměti do souboru. Při ukončení výpočtu příkazem STOP RUN nebo chybu bez předchozího vyvolání podprogramu ICVIRF se obsah úseku do souboru nezapisuje!!! Příklad: Máme prodloužit soubor soub.xyz o právě všechny logické věty souboru ZDROJ (mají pevnou délku 80 bytů a jejich počet je nejvýše rovný 500): LINKAGE SECTION. 01 SOUBOR. 02 VETA PIC X(80) OCCURS 500 DEPENDING POCET. : OPEN INPUT ZDROJ. CALL 'ICVIRG' USING SOUBOR 40000 'soub.xyz' 'APPEND'. MOVE 0 TO POCET. CTENI. READ ZDROJ AT END GO KONEC. ADD 1 TO POCET. MOVE ZVETA TO VETA(POCET). GO CTENI. KONEC. CALL 'ICVIRF' USING SOUBOR. CLOSE ZDROJ. Podprogram ICVIRG vyhradí úsek paměti o délce 40000 bytů a ztotožní jej s položkou SOUBOR; počáteční obsah tohoto úseku paměti je obecně nedefinovaný. (Bylo by vhodné nyní otestovat, zda se toto vyhrazení podařilo, tzn. zda je ukazatel přidělený položce SOUBOR nenulový; viz 17.4.) Nyní přečteme všechny logické věty souboru ZDROJ a naskládáme je za sebe do položky SOUBOR. (Chybí zde test, zda jejich počet nepřesáhl maximální předpokládaný počet 500.) Položka POCET obsahuje počet těchto logických vět, takže implicitní délka položky SOUBOR je právě POCET*80 bytů, tzn. položka SOUBOR stále zahrnuje právě všechny tyto logické věty. Proto podprogram ICVIRF prodlouží dosavadní soubor soub.xyz o POCET*80 bytů (= implicitní délka položky SOUBOR), neboli o právě všechny přečtené logické věty. (Kdyby soubor soub.xyz dosud neexistoval, pak podprogram ICVIRF tento soubor vytvoří, a to o délce POCET*80 bytů.) Bylo by možné uvést v příkazu CALL 'ICVIRF' druhý argument, musela by to ovšem být celočíselná numerická položka nebo speciální index nebo UI-položka s hodnotou POCET*80.