パラメータの受け取り (ILE RPG)

プロトタイプ(PR) とプロシージャー・インターフェイス (PI)

今までの RPG では、パラメータの受け取りは *ENTRY PLIST を使用して行っていたと思います。
ILE RPG でも *ENTRY PLIST は使えるのですが (このあたりが良くも悪くも"後方互換性の鬼"みたいな RPG らしいところなのですが)、ILE RPG らしいやり方、という意味では今後は「プロトタイプ」を使用して行う方がよさそうです。

自ソースの中にあっても、他のモジュールの中にあっても、使用する関数にはプロトタイプ宣言は必要です。(C と同様ですね)
プロトタイプ宣言というものが、使用する関数の名前と引数の型/数といった、まぁ名刺みたいなものだと考えれば、やはり自分のメイン・プロシージャーに対して存在するのは自然ですよね。ドキュメンテーションという観点からも望ましいと言えそうです。


例えばこんなふうにパラメータを受け取っていたとしましょう。

     c     *entry        plist                                                                      
     c                   parm                    CTJob            10                                
     c                   parm                    CTUser           10                                
     c                   parm                    CTJobN            6              

同じことを ILE RPG らしく (実は *ENTRY PLIST は使用できるのですが、本来的に ILE RPG らしいやり方で、という意味で) 書き換えると以下のようになります。
今までのような C-spec ではなく D-spec を使用して定義します。

(「ILE RPG 解説書」には「メイン・プロシージャー用のパラメータは、グローバル定義仕様書の中のプロトタイプとプロシージャー・インターフェイスを使用する」と書いてあります。
つまりプログラムのほぼ一番最初に以下と同様の定義があり、プログラムは原則として一致する名前、つまりこの場合では RtvJobInf2 という名前である必要があります)

     D RtvJobInf2      PR                                                                           
     d  JobNameIn                    10a                                      
     d  JobUserIn                    10a                                                            
     d  JobNumberIn                   6a                                                            
      *                                                                                             
     D RtvJobInf2      PI                                                                           
     d  JobNameIn                    10a                                                            
     d  JobUserIn                    10a                                                            
     d  JobNumberIn                   6a      

PR はプロトタイプ定義で外部から見た場合のこのプロシージャーの定義を与えます。つまり名前と引数ですね。このプロシージャーを使用するにはその二つが必要になるわけです。

(「ILE RPG プログラマーの手引き」には「プロトタイプとは、コンパイラーがコンパイル時にインターフェイスをチェックできる呼び出しインターフェイスの外部定義です」と記述があります)

PI はプロシージャー・インターフェイスを表し、このプロシージャーの内部での受け取る引数の変数名、タイプを記述しています。
つまり、ここで定義した JobNameIn、JobUserIn、JobNumberIn がこのプロシージャーのローカル変数となり、受け取り値として使用されることになります。今回はプロトタイプ (PR) で定義した変数名と同じ名前になっていますが、数とタイプが合っていればいいので、同じでも同じでなくてもかまいません。極端に言うと、プロトタイプ (PR) には変数名を定義しなくても OK です。

(「ILE RPG 解説書」には「プロトタイプ・プロシージャーに呼び出しパラメータまたは戻り値がある場合には、プロシージャー・インターフェイス定義が含まれていなければなりません。プロシージャー・インターフェイス定義は、プロシージャー定義の中でのプロトタイプ情報の繰り返しです。これは、プロシージャーへの入り口パラメーターを宣言し、プロシージャーの内部定義を外部定義(プロトタイプ)と確実に整合させるために使用されます」と記述があります)

読み取り専用

以下のように const と定義すれば読み取り専用の変数として渡され、プロシージャー内部で変更できないようにできます。
C の const 修飾子と同様ですね。

     D RtvJobInf2      PR                                                                           
     d  JobNameIn                    10a   const                                   
     d  JobUserIn                    10a   const                                                         
     d  JobNumberIn                   6a   const                                                         
      *                                                                                             
     D RtvJobInf2      PI                                                                           
     d  JobNameIn                    10a   const                                                         
     d  JobUserIn                    10a   const                                                         
     d  JobNumberIn                   6a   const   

値渡し

以下のように value と定義すれば値渡しになるので、呼び出し元のプロシージャーが値を変更してしまっても、値を渡され呼び出されたプロシージャー内の変数の値には影響がない、といったようにより細かい制御ができるようになっています。

     D RtvJobInf2      PR                                                                           
     d  JobNameIn                    10a   value                                   
     d  JobUserIn                    10a   value                                                         
     d  JobNumberIn                   6a   value                                                         
      *                                                                                             
     D RtvJobInf2      PI                                                                           
     d  JobNameIn                    10a   value                                                         
     d  JobUserIn                    10a   value                                                         
     d  JobNumberIn                   6a   value   

[Top Pageに戻る]

Ads by TOK2