Ibm midrange 在非循环程序中设置*inlr是否有任何影响?

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

我最近偶然发现了一个服务程序,其中在显式关闭文件后使用*inlr=*on(代码如下)。我觉得太过分了。据我所知,是rpg循环处理资源的释放。因此,如果没有循环(即在带有main/nomain h-spec的程序中),那么*inlr=*on就没有办法产生任何影响,但是。。。我还没有找到任何确认,由于周期相关的问题对我来说是非常新的,我可能遗漏了一些东西

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、 机会是询问服务计划和/或线性主计划。您所说的是循环主计划。