在阅读关于RTNPARM关键字的IBM文档之后,我仍然不清楚如何处理它。
有人可以给我一个小程序示例吗?
如果速度快得多,为什么IBM没有暗示它?
答案 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;
的更多细节和示例
答案 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的子过程是一个子过程。