2017-03-24 4 views
0

RTNPARMキーワードについてのIBMの文書を読んだ後も、それをどのように処理しなければならないのかはまだ分かりません。
誰かが私に小さな手順の例を教えてもらえますか?RTNPARMキーワードとユースケースの例

もっと速い場合、なぜIBMが暗黙のうちにしなかったのですか?

答えて

1

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; 
1

あなたは「それを処理する必要はありません」というのは、その美しさです。

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; 

Large Subprocedure Return Values: V7 Brings Relief

1

もう一つの理由は、それが純粋なRPGのことだということです。プロシージャーが別のプログラミング言語で記述されているか、別の言語から呼び出されている場合、RTNPARMは使用できません。これは、他の言語は通常の戻り値機構が使用されていると想定するためです。

0

MicrosoftのVB/VBAとサブプロシージャを比較すると、rtnparmのサブプロシージャは関数であり、rtnparmのないサブプロシージャはサブプロシージャです。

関連する問題