ILE RPG サブプロシージャの使い方 (8) - プロトタイプ宣言の一元管理 -

C の関数でも同じことですが、サブプロシージャそのものは共用されるものの、プロトタイプ宣言はその関数/サブプロシージャを呼び出すプログラムには必ず定義する必要があるので、いろんなところに分散して存在することになります。

それこそコピー&ペーストする手もあるのですが、あまり良い手ではなさそうですね…

C の場合はそれを克服するために、プロトタイプ宣言を独立させ、ヘッダ・ファイルというものにまとめて利用します。

ILE RPG でも同じことができます。


プロトタイプ宣言のみの独立

各サブプロシージャからプロトタイプ宣言の部分のみを切り出したソースメンバを作成します。

ILE RPG サブプロシージャの使い方 (7) - サービス・プログラムの世代管理 -」の例で言えば、以下のような 3つのプロトタイプ宣言のみのメンバを作成します。

FACTORIALH

     Dfactorial        PR             8f                                                            
     D p1                            10i 0                                                          

PERMH

     Dperm             PR             8f                                                            
     D p1                            10i 0                                                          
     D p2                            10i 0                                                          

COMBH

     Dcomb             PR             8f                                                            
     D p1                            10i 0                                                          
     D p2                            10i 0                

↑はコピー元となるだけなので、ソースファイルにメンバとして存在していれば OK です。
コンパイルなどを行う必要はありません。

使い方

それぞれのプロトタイプ宣言のソースを、プロトタイプ宣言が必要なところに /copy で挿入させるようにします。
C でのヘッダファイルの #include と同じですね。

たとえばこんな↓かんじです。

FACTORIAL

      *                                                                                             
      * CRTRPGMOD MODULE(FACTORIAL) SRCFILE(QRPGLESRC) DBGVIEW(*SOURCE)                             
      *                                                                                             
     H NOMAIN                                                                                       
      *                                                                                             
      /copy proctest/qrpglesrc,factorialh                                                          
      *                                                                                             
     Pfactorial        B                   EXPORT                                                   
     Dfactorial        PI             8f                                                            
     D n                             10i 0                                                          
     D m               S             10i 0                                                          
     D i               S             10i 0                                                          
     D k               S              8f                                                            
      *                                                                                             
      /free                                                                                         
                                                                                                    
          k = 1 ;                                                                                   
                                                                                                    
          if n = 0 ;                                                                                
             m = 1      ;                                                                           
          else ;                                                                                    
             m = n ;                                                                                
          endif ;                                                                                   
                                                                                                    
          for i = 1 to m ;                                                                          
             k = k*i;                                                                               
          endfor ;                                                                                  
                                                                                                    
          return k ;                                                                                
                                                                                                    
      /end-free                                                                                     
     Pfactorial        E     
      *                   

PERM

      *                                                                                             
      * CRTRPGMOD MODULE(PERM) SRCFILE(QRPGLESRC) DBGVIEW(*SOURCE)                                  
      *                                                                                             
     H NOMAIN                                                                                       
      *                                                                                             
      /copy proctest/qrpglesrc,permh                                                               
      *                                                                                             
     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                                                            
      *                                                                                             
      /copy proctest/qrpglesrc,factorialh                                                          
      *                                                                                             
      /free                                                                                         
                                                                                                    
          nr = n - r ;                                                                              
                                                                                                    
          n1 = factorial(n) ;                                                                       
          nr1 = factorial(nr) ;                                                                     
          p = n1/nr1 ;                                                                              
                                                                                                    
          return p ;                                                                                
                                                                                                    
      /end-free                                                                                     
     Pperm             E                                                                            
      *                   

COMB

      *                                                                                             
      * CRTRPGMOD MODULE(COMB) SRCFILE(QRPGLESRC) DBGVIEW(*SOURCE)                                  
      *                                                                                             
     H NOMAIN                                                                                       
      *                                                                                             
      /copy proctest/qrpglesrc,combh                                                               
      *                                                                                             
     Pcomb             B                   EXPORT                                                   
     Dcomb             PI             8f                                                            
     D n                             10i 0                                                          
     D r                             10i 0                                                          
      *                                                                                             
     D nr              S             10i 0                                                          
     D c               S              8f                                                            
     D p               S              8f                                                            
     D r1              S              8f                                                            
      *                                                                                             
      /copy proctest/qrpglesrc,factorialh                                                          
      *                                                                                             
      /copy proctest/qrpglesrc,permh                                                               
      *                                                                                             
      /free                                                                                         
                                                                                                    
          nr = n - r ;                                                                              
                                                                                                    
          p = perm(n : r) ;                                                                         
          r1 = factorial(r) ;                                                                       
          c = p / r1 ;                                                                              
                                                                                                    
          return c ;                                                                                
                                                                                                    
      /end-free                                                                                     
     Pcomb             E                                                                            
      *                                                                                             

メインのプログラムの方も同様に /copy を挿入すれば OK です。

TESTFPC2

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

[Top Pageに戻る]

Ads by TOK2