Ibm midrange 在非循环程序中设置*inlr是否有任何影响?
我最近偶然发现了一个服务程序,其中在显式关闭文件后使用*inlr=*on(代码如下)。我觉得太过分了。据我所知,是rpg循环处理资源的释放。因此,如果没有循环(即在带有main/nomain h-spec的程序中),那么*inlr=*on就没有办法产生任何影响,但是。。。我还没有找到任何确认,由于周期相关的问题对我来说是非常新的,我可能遗漏了一些东西Ibm midrange 在非循环程序中设置*inlr是否有任何影响?,ibm-midrange,rpgle,Ibm Midrange,Rpgle,我最近偶然发现了一个服务程序,其中在显式关闭文件后使用*inlr=*on(代码如下)。我觉得太过分了。据我所知,是rpg循环处理资源的释放。因此,如果没有循环(即在带有main/nomain h-spec的程序中),那么*inlr=*on就没有办法产生任何影响,但是。。。我还没有找到任何确认,由于周期相关的问题对我来说是非常新的,我可能遗漏了一些东西 if %open(file); close file; endif; *inl
if %open(file);
close file;
endif;
*inlr = *on;
return *on;
简言之,没有
“最后记录”指示器仅由循环使用。它不用于NOMAIN服务程序或线性主程序
警察说
注意当控制规范中指定了MAIN或NOMAIN时,子过程不生成循环代码
其他参考资料IBM的Barbara Morris(RPGLE编译器开发人员,a) 线性主程序将在计算结束时结束。如果需要,可以设置*INLR,但它不会执行任何与周期相关的操作,例如关闭文件 这里是循环主模块和线性主模块的比较。"
在线性main或nomain模块中,
*inlr
无效。据我所知,没有明确的文档说明这一点,但第4页的
注:不为子流程生成周期代码,也不为主要或非主要流程生成周期代码
在控制规范中规定
由于检查*inlr
是循环的一部分,因此推断没有功能请尝试以下操作:
cl程序调用rpg程序
pgm
call testlrr
call testlrr
call testlrr
endpgm
那么这就是rpg
ctl-opt dftactgrp(*no) actgrp('QILE');
dcl-pr TESTLRR extpgm('TESTLRR');
end-pr;
dcl-pi TESTLRR;
end-pi;
dcl-s counter zoned(5:0);
counter = counter + 5;
dsply counter;
return;
您将看到变量的值在后续调用中继续递增
是的……你可以通过激活组、inz语句等来处理它……但是*inlr非常便宜而且非常简单。你比我快了10秒。今天瘦了,是吗?:)我认为这是不对的。即使在主过程中,*LR指示器也会导致变量被卸载。如果你从程序返回时没有设置*LR on,变量下一次调用时,ABLE将保持相同的值。RPG程序员指南中提到:“ILE RPG运行时管理数据,以便结束程序和重新初始化数据的语义与OPM RPG相同,尽管实际存储不会像OPM RPG程序结束时那样被删除。如果上一次对过程的调用以LR on结束或异常结束,则会重新初始化数据。“@Mike…这是指一个循环主程序。这句话在[(RPG程序员指南)的v5中在引入linear main之前。请参阅其他参考资料…我已添加到我的答案中。感谢您提供的其他参考资料。听起来像是很好的权威。我使用的软件在没有设置*LR的情况下调用其他程序,因此当您返回时,所有变量仍处于设置状态,但这一定是因为旧代码是OPM风格,被视为循环主程序,即使您没有可循环的输入主文件。将*inlr=*行去掉甚至不会对性能产生可测量的变化。您将在野外遇到更多这样的程序,最好不要管它们,以免在更改服务程序和每个程序时更改其签名调用服务程序的am中断。
*inlr
不会更改服务程序的签名。唯一的更改方法是更改导出。即使更改参数也不能更改服务程序的签名,除非您的意思与binder sourc生成的签名不同e、 机会是询问服务计划和/或线性主计划。您所说的是循环主计划。