ILE RPG 程序变量值能否在调用之间保留在内存中?

Can ILE RPG program variable values remain in memory between calls?

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

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

长答案 *INLR 是 RPG 循环的函数,而不是激活组的函数,只要您使用的是循环主程序,它的大部分功能都应该按预期运行(程序未卸载除外)。对于线性主程序,一切皆有可能。手册说,功能取决于线性模块中的周期 "may not be specified"。文档并没有直接明确指出 *INLR 在线性模块中不会按预期运行,但是,您需要知道 *INLR 与循环相关联,并且线性模块不包括循环.线性模块是使用 MAINNOMAIN 关键字的模块。顺便说一句,还有其他一些东西可以控制变量初始化以及(或代替)LR.

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

如果你使用命名激活组,或者ACTGRP(*CALLER)并且调用者在命名激活组中运行,并且当激活组中的所有程序结束时手动回收激活组,然后字段将被初始化。 RCLRSC 在这里没有影响。

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

最后,这一切只适用于全局范围内的变量。在子过程中定义的局部作用域变量总是在进入时初始化,并在 return 时释放,除非它们被定义为静态的。静态局部变量的行为类似于全局变量。也就是说,它们是在过程的第一次调用期间分配和初始化的,并在调用过程中持续存在。

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