ILE RPG程序变量值可以在调用之间保留在内存中吗?

时间:2017-02-28 11:22:31

标签: ibm-midrange rpgle

如果我使用DFTACTGRP创建一个ILE RPG程序(* NO),我的理解是程序保留在内存中,直到激活组被销毁。如果我在关闭LR的情况下退出程序,那么下次调用时变量会重新初始化还是保持它们的值?

2 个答案:

答案 0 :(得分:7)

简答
不,它们不会重新初始化,除非设置ACTGRP(*New)或以其他方式回收激活组。

长答案 *INLR是RPG循环的函数,而不是激活组的函数,并且只要您使用循环主程序,它应该主要按预期运行(除了程序未卸载)。对于线性主程序,所有投注均已关闭。该手册说明在线性模块中可能没有“指定”依赖于循环的特征。文档没有明确指出*INLR在线性模块中不会按预期运行,但是,您需要知道*INLR与循环相关联,并且线性模块不包括循环。线性模块是使用MAINNOMAIN关键字的模块。很明显,还有其他东西可以控制变量初始化以及(或代替)LR

如果使用ACTGRP(*NEW),程序启动时会创建一个新的激活组,并在程序结束时隐式结束。因此,无论LR是打开还是关闭,或者程序是循环主程序还是线性主程序,程序都会关闭。

如果您使用命名的激活组或ACTGRP(*CALLER)且呼叫者正在命名的激活组中运行,并且当激活组中的所有程序都结束时手动回收激活组,则将初始化字段。 RCLRSC在这里没有任何影响。

如果您使用默认激活组或ACTGRP(*CALLER)并且调用方正在默认激活组中运行,并且手动RCLRSC,则会初始化字段。 RCLACTGRP在这里没有任何影响。小心,这可能会导致问题。

最后,这一切都只适用于全局范围内的变量。局部范围变量(在子过程中定义的变量)总是在输入时初始化,并在返回时释放,除非它们被定义为静态。静态局部变量的行为类似于全局变量。也就是说,它们在程序的第一次调用期间被分配和初始化,并且在调用期间保持不变。

答案 1 :(得分:2)

线性主模块的行为类似于关于全局变量的无模块。全局变量在模块中第一次调用过程时初始化,并且永远不会重新初始化。 https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/rzasd/cycvslinear.htm