如果我使用dftactgrp(*no)创建一个ILE RPG程序,我的理解是该程序一直保持在内存中,直到激活组破坏为止。如果我关闭LR退出程序,是否会在下一个呼叫上重新初始化变量,还是保持其值?
简短答案
不,除非设置ACTGRP(*New)
或您以其他方式收回激活组,否则它们不会重新定位。
长答案 *INLR
是RPG循环的函数,而不是激活组的函数,只要您使用循环主程序,就应该大多按预期(除非卸载)的功能。对于线性主要程序,所有赌注都关闭了。该手册说,在线性模块中取决于"未指定"周期的特征。该文档并未明确指出*INLR
在线性模块中不会如预期的那样运行,但是,您需要知道*INLR
与周期绑定,并且线性模块不包括周期。线性模块是使用MAIN
或NOMAIN
关键字的模块。顺便说一句,还有其他东西可以控制变量初始化以及(或而不是)LR
。
如果使用ACTGRP(*NEW)
,则在程序启动时创建一个新的激活组,并在程序结束时隐含结束。因此,无论LR
是否打开还是关闭,该程序都会关闭,甚至是程序是一个周期主程序,还是线性主程序。
如果您使用命名激活组或ACTGRP(*CALLER)
并且呼叫者在命名激活组中运行,并且当激活组中的所有程序结束时,手动回收激活组,则将初始化字段。RCLRSC
在这里没有影响。
如果您使用默认激活组或ACTGRP(*CALLER)
,并且呼叫者在默认激活组中运行,并且手动RCLRSC
,则将初始化字段。RCLACTGRP
在这里没有影响。请小心,这可能导致问题。
最后,这仅适用于全局范围中的变量。局部范围变量(在子处理中定义的变量)始终在输入时初始化,并在返回时释放,除非将其定义为静态。静态局部变量的行为就像全球变量。也就是说,它们是在过程的第一个呼叫中分配和初始化的,并在呼叫中持续存在。
线性模块的行为就像关于全局变量的名称模块。首次在模块中调用过程时,全局变量是初始化的,并且它们永远不会重新初始化。https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/rzasd/cycvslinear.htm