RTNPARM关键字和用例的示例

时间:2017-03-24 15:03:13

标签: ibm-midrange procedure rpgle

在阅读关于RTNPARM关键字的IBM文档之后,我仍然不清楚如何处理它。
有人可以给我一个小程序示例吗?

如果速度快得多,为什么IBM没有暗示它?

4 个答案:

答案 0 :(得分:1)

你没有“必须处理它”,这就是它的美丽。

 D TestProc1       Pr         32000a

 D TestProcV7      Pr         32000a    RTNPARM

myResults = TestProc1();
myResults = TesProcV7();

无论是否指定了RTNPARM,对过程的调用都编码相同。

这不是默认(即隐式),因为它是在v7中添加的。如果返回的值大于16个字节,它也会更快。

另外,如果被调用的过程具有可选参数,则必须在被调用过程中以不同的方式处理它们。

鉴于

 D MyProc          PI                  LikeDS(myResult)
 D  Compulsory                   20a
 D  Optional                     10a   Options(*NoPass)

旧方式:

   If %Parms > 1; 
      DoStuff();
   EndIf;

新方式

   If %ParmNum(Optional) <= %Parms; 
      DoStuff();
   EndIf;

以上Large Subprocedure Return Values: V7 Brings Relief

的更多细节和示例

答案 1 :(得分:1)

RTNPARM用于返回通常仅部分使用的非常长的字符值的过程。返回值被压入堆栈,将64K字符推入堆栈需要更长的时间而不是10字节的字符。通过引用传递的参数仅将指针放在堆栈上。当您使用RTNPARM关键字时,它将返回值视为通过引用传递的参数。在内部,第一个参数成为引用传递的返回值。您仍然以通常的方式传递和检索返回值,但如果要使用%parms()获取参数数量,参数编号将增加1。 IBM引入了%parmnum()内置来处理这个问题。

所以这是一个简单的例子:

   dcl-proc sample;
     dcl-pi *n Varchar(65535) RtnParm;
       parm1   VarChar(256) const options(*nopass);
     end-pi;

     dcl-s result         Varchar(65535) Inz('');
     dcl-s str1           Varchar(256) Inz('');

     if %parms() >= %parmnum(parm1);
       str1 = parm1;
     endif;

     // do some stuff

     return result;
   end-proc;

答案 2 :(得分:1)

RTNPARM无法隐含的另一个原因是它是一个纯粹的RPG游戏。如果该过程是用另一种编程语言编写的,或者是用另一种语言调用的,则不能使用RTNPARM,因为另一种语言会假定正在使用正常的返回值机制。

答案 3 :(得分:0)

如果将子过程与微软VB / VBA进行比较,则使用rtnparm的子过程是一个函数,而没有rtnparm的子过程是一个子过程。