ILE RPG サブプロシージャの使い方 (9) - プロトタイプ宣言をコンパイラ・ディレクティブを使ってコピー -

ILE RPG サブプロシージャの使い方 (8) - プロトタイプ宣言の一元管理 -」で、プロトタイプ宣言をどうやって一元管理するかについて紹介しましたが、サブプロシージャとプロトタイプ宣言を別のソースではなくひとつのソースで管理したい、というような考え方もありそうです。

そんな場合、コンパイラ・ディレクティブを使用して同じようなことができます。

ちなみに、あまり一般的ではないと思います。

前回紹介したやり方は、まずプロトタイプ宣言のみのソースメンバを作成し、それをサブプロシージャ自体の記述にも、そのサブプロシージャを使うプログラムにコピーして使う、というやり方でした。
最初にプロトタイプ宣言のみを記述する、というのはサブプロシージャの呼び出し方を最初に仕様として決める、ということですね。そのうえで実際に処理を記述する、というのは順番として正しいと思いますし、管理方法として正しいあり方だと思いますので、今回のやり方がおすすめというわけでないんです。

一応こんなこともできる、ということと、コンパイラ・ディレクティブの使い方の紹介もかねて、ということで。


サブプロシージャ側

↓がサブプロシージャの記述です。

      /if not defined(getPR)                                                                        
      *                                                                                             
      * CRTRPGMOD MODULE(PERM) SRCFILE(QRPGLESRC) DBGVIEW(*SOURCE)                                  
      *                                                                                             
     H NOMAIN                                                                                       
      *                                                                                             
      /endif                                                                                        
     Dperm             PR             8f                                                            
     D p1                            10i 0                                                          
     D p2                            10i 0                                                          
      *                                                                                             
      /if not defined(getPR)                                                                        
     Pperm             B                   EXPORT                                                   
     Dperm             PI             8f                                                            
     D n                             10i 0                                                          
     D r                             10i 0                                                          
      *                                                                                             
     D nr              S             10i 0                                                          
     D n1              S              8f                                                            
     D nr1             S              8f                                                            
     D p               S              8f                                                            
      *                                                                                             
     Dfactorial        PR             8f                                                            
     D p1                            10i 0                                                          
      *                                                                                             
      /free                                                                                         
                                                                                                    
          nr = n - r ;                                                                              
                                                                                                    
          n1 = factorial(n) ;                                                                       
          nr1 = factorial(nr) ;                                                                     
          p = n1/nr1 ;                                                                              
                                                                                                    
          return p ;                                                                                
                                                                                                    
      /end-free                                                                                     
     Pperm             E                                                                            
      *                                                                                             
      /endif                           

プロトタイプ宣言以外のところを

      /if not defined(getPR)                                                                        

      /endif   

で囲っておきます。

メイン・プログラム側

メインのプログラムの方を見てみましょう。

      *                                                                                             
      * CRTRPGMOD MODULE(TESTFP3) SRCFILE(QRPGLESRC) DBGVIEW(*SOURCE)                               
      * CRTPGM PGM(TESTFP3) MODULE(TESTFP3 FACTORIAL PERM)                                          
      *                                                                                             
      * CRTSRVPGM SRVPGM(MATH) MODULE(FACTORIAL PERM) SRCFILE(QSRVSRC)                              
      * CRTPGM PGM(TESTFP3) MODULE(TESTFP3) BNDSRVPGM(MATH)                                         
      *                                                                                             
      /define getPR                                                                                 
      /copy proctest/qrpglesrc,perm                                                                 
      /undefine getPR                                                                               
      *                                                                                             
     D k               S             10i 0                                                          
     D r               S             10i 0                                                          
     D n               S             10i 0                                                          
      *                                                                                             
      /free                                                                                         
                                                                                                    
          n = 5 ;                                                                                   
          r = 2 ;                                                                                   
          k = perm(n : r) ;                                                                         
          dsply  %char(k) ;                                                                         
          return ;                                                                                  
                                                                                                    
      /end-free                                                                                     
      *        

プロトタイプ宣言が挿入されるはずのところで

      /define getPR  

とあって、getPR という条件が定義されています。
続いて、/copy でソースメンバからのコピーを行うようにしています。

      /copy proctest/qrpglesrc,perm                                                                 

ここでサブプロシージャ側のソースの

      /if not defined(getPR)                                                                        

が効いてくるわけですね。
getPR が定義(define)されているので、ここから

      /endif   

までも部分は除外されるわけです。

プロトタイプ宣言がコピーされ、その後にはまた

      /if not defined(getPR)                                                                        

があり、ソースの最後に

      /endif   

があるため、プロトタイプ宣言以降はすべて除外されるようになっています。

コンパイル・リストで確認

↓がメイン・プログラムのコンパイル・リストです。

コンパイラがどのようにサブプロシージャのソースからコピーを行ったかが確認できますね。

[Top Pageに戻る]

Ads by TOK2