2017-02-28 13 views

回答

6

簡答
不,他們沒有得到重新初始化,除非ACTGRP(*New)設置或者你收回激活組在一些其他的方式。

長的答案 *INLR是RPG週期的函數,而不是激活組,並預期應主要功能(除了程序沒有被卸載),只要您使用的是循環主程序。對於線性主節目,所有投注都關閉。該手冊指出,線性模塊中依賴於循環的功能「可能未指定」。該文檔沒有直接明確指出*INLR在線性模塊中不能正常工作,但是,您需要知道*INLR與循環相關,並且線性模塊不包含循環。線性模塊是使用MAINNOMAIN關鍵字的模塊。有意思的是,還有其他的東西可以控制變量初始化以及(或者代替)LR

如果使用ACTGRP(*NEW),程序啓動時會創建一個新的激活組,並在程序結束時隱式結束。因此,每次LR處於打開或關閉狀態,甚至程序是循環主程序還是線性主程序時,都會關閉程序。

如果您使用已命名的激活組或ACTGRP(*CALLER),並且調用方正在指定的激活組中運行,並且在激活組中的所有程序結束時手動回收激活組,則字段將被初始化。 RCLRSC在這裏沒有影響。

如果您使用默認激活組或ACTGRP(*CALLER)並且調用者正在默認激活組中運行,並且手動RCLRSC,則字段將被初始化。 RCLACTGRP在這裏沒有影響。小心,這可能會導致問題。

最後,這全部只適用於全局範圍內的變量。本地作用域變量(在子過程中定義的那些變量)始終在條目中初始化,並在返回時釋放,除非它們被定義爲靜態。靜態局部變量的行爲與全局變量相似。也就是說,它們在第一次調用過程期間被分配和初始化,並在呼叫中保持不變。

+0

謝謝@jmarkmurphy瞭解詳細的答案。如果我用inz聲明初始化變量會發生什麼。每次程序被調用時它會被設置爲這個值還是第一次被加載到內存中。即inz聲明會覆蓋上次調用的值還是保留前一個調用的值? – mike

+1

同樣的答案。 'Inz'只是決定了程序何時初始化時變量初始化的內容。 – jmarkmurphy

+0

你的答案是我從閱讀有關激活組的預期內容。但是,當進行反彙編時,我會重複地從測試工具中調用它,並且每次程序運行時都會重新初始化變量。該程序在命名的激活組中運行。代碼位於模塊中,並在目標版本V7R1M0上編譯。我不確定我能做些什麼來找出什麼是重新初始化變量。 – mike