RTNPARMキーワードについてのIBMの文書を読んだ後も、それをどのように処理しなければならないのかはまだ分かりません。
誰かが私に小さな手順の例を教えてもらえますか?RTNPARMキーワードとユースケースの例
もっと速い場合、なぜIBMが暗黙のうちにしなかったのですか?
RTNPARMキーワードについてのIBMの文書を読んだ後も、それをどのように処理しなければならないのかはまだ分かりません。
誰かが私に小さな手順の例を教えてもらえますか?RTNPARMキーワードとユースケースの例
もっと速い場合、なぜIBMが暗黙のうちにしなかったのですか?
RTNPARMは手続きのためであるから、上記の詳細と例より非常に長い文字値が返され、頻繁に部分的にしか使用されません。戻り値はスタックにプッシュされ、64K文字をスタックにプッシュするのには10バイトの文字を使用するのに時間がかかります。参照渡しされるパラメータは、スタック上にポインタを置くだけです。 RTNPARMキーワードを使用すると、戻り値は参照渡しのパラメーターのように扱われます。内部的には、最初のパラメータは参照渡しの戻り値になります。戻り値は引き続き通常と同じ方法で渡しますが、%parms()
を使用してパラメータの数を取得する場合は、パラメータ番号が1つ増えます。 IBMはこれに対処するために%parmnum()
を組み込みました。だからここ
は簡単な例です:RTNPARMは暗黙的にできません
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;
あなたは「それを処理する必要はありません」というのは、その美しさです。
D TestProc1 Pr 32000a
D TestProcV7 Pr 32000a RTNPARM
myResults = TestProc1();
myResults = TesProcV7();
プロシージャのコールに関係なくRTNPARMが指定されているというかの同一の符号化されています。
v7で追加されたデフォルトではありません(暗黙的)。また、返される値が16バイトより大きい場合にのみ高速です。
また、呼び出されたプロシージャにオプションのparmsがある場合、呼び出されるプロシージャ内でそれらを少しずつ処理する必要があります。
考える
D MyProc PI LikeDS(myResult)
D Compulsory 20a
D Optional 10a Options(*NoPass)
古い方法:
If %Parms > 1;
DoStuff();
EndIf;
新しい方法
If %ParmNum(Optional) <= %Parms;
DoStuff();
EndIf;
もう一つの理由は、それが純粋なRPGのことだということです。プロシージャーが別のプログラミング言語で記述されているか、別の言語から呼び出されている場合、RTNPARMは使用できません。これは、他の言語は通常の戻り値機構が使用されていると想定するためです。
MicrosoftのVB/VBAとサブプロシージャを比較すると、rtnparmのサブプロシージャは関数であり、rtnparmのないサブプロシージャはサブプロシージャです。