2017-09-11 25 views
2

我最近偶然發現了一個服務程序,其中* inlr = * on在顯式關閉文件後使用(代碼如下)。這對我來說感覺相當過分。從我發現的是處理資源釋放的rpg循環。因此,如果沒有循環(即在主要/無主要h規格的程序中),* inlr = *就沒有辦法產生任何效果,但是...我一直未能找到任何確認,週期相關的問題對我來說是非常新的我可能會錯過一些東西...在非循環程序中設置* inlr是否有效?

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

將* inlr = *取消,甚至不會對性能產生可衡量的變化。你將會遇到更多這樣的問題,讓他們單獨放置,以免在更改服務程序的簽名時更改服務程序的簽名,並且每個調用服務程序的程序都會中斷。 – danny117

+0

'* inlr'不會更改服務程序的簽名。改變這種情況的唯一方法是改變出口。即使改變參數也不能改變服務程序的簽名,除非你的意思與binder源生成的簽名不同。 – jmarkmurphy

回答

4

總之沒有。

「最後記錄」指示器僅供週期使用。它不用於NOMAIN服務程序或線性MAIN程序。

RPG IV Programmer's Guide

爲子過程不產生循環碼,或者當該控制規範中指定MAIN或NOMAIN。

其他參考
IBM的芭芭拉·莫里斯(RPGLE編譯器開發者,在post to the RPG mailing list

的線性主過程時,得到的計算到底會剛剛結束。你可以設置 * INLR,但是它不會執行任何與週期有關的事情,比如關閉文件。

下面是循環主模塊和線性主模塊的比較。 http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frzasd%2Fsc09250802.htm

+1

你打我10秒 – jmarkmurphy

+0

今天睡了嗎? :) – Charles

+0

我不認爲這是正確的。即使在MAIN過程中,* LR指示器也會導致變量被卸載。如果您在沒有設置* LR的情況下從程序返回,變量將在下次調用時保持相同的值。 RPG程序員指南提到:「ILE RPG運行時管理數據,以便結束程序和重新初始化數據的語義與OPM RPG相同,但實際存儲不會像OPM RPG程序那樣被刪除**如果先前的程序調用以LR開啓或異常結束,則數據將重新初始化**「 – Mike

3

在直線爲主,或nomain模塊,*inlr沒有影響。據我所知,沒有這沒有明確的文件,但ILE RPG Programmer's Guide,第4頁,指出

注意:爲子過程不會產生循環碼,或者當該控制規範中指定MAIN或NOMAIN

由於檢查*inlr是週期的一部分,這樣我。 nferrs無功能

-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是相當便宜和相當簡單的。

+0

有機會詢問有關服務計劃和/或線性主要計劃。你在談論一個循環主程序。 – Charles

+0

啊......我糾正了。 –