在非循环程序中设置* inlr是否有效?

时间:2017-09-11 12:34:29

标签: ibm-midrange rpgle

我最近偶然发现了一个服务程序,其中在明确关闭文件后使用* inlr = * on(下面的代码)。对我来说这感觉相当过分。从我发现它是rpg循环来处理资源的释放。因此,如果没有循环(即在具有main / nomain h-specs的程序中),* inlr = * on没有办法产生任何影响,但是......我无法找到任何确认,因为周期相关问题对我来说很新,我可能会遗漏一些东西......

if %open(file);      
  close file;        
endif;                  
*inlr = *on;            
return *on; 

3 个答案:

答案 0 :(得分:4)

简而言之。

"最后一条记录"指标仅用于循环。它未在NOMAIN服务程序或线性MAIN程序中使用。

RPG IV Programmer's Guide

  

注意没有为子过程生成循环代码,或者在控件规范中指定了MAIN或NOMAIN。

其他参考资料
IBM的Barbara Morris(RPGLE编译器开发人员,post to the RPG mailing list

  

线性主程序将在计算结束时结束。如果需要,你可以 设置* INLR,但它不会做任何与循环相关的事情,比如关闭文件。

     

以下是循环主模块和线性主模块的比较。http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frzasd%2Fsc09250802.htm"

答案 1 :(得分:3)

在线性主模块或非主模块中,*inlr无效。据我所知,没有明确的文档记录,但第4页的ILE RPG Programmer's Guide说明

  

注意:没有为子过程或MAIN或NOMAIN生成循环代码   在控制规范中指定。

由于检查*inlr是周期的一部分,因此推断没有功能

答案 2 :(得分:-1)

试试这个:

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非常便宜并且非常简单。