ILE RPG サブプロシージャの使い方 (1) - C の関数との類似性 -

ILE RPG のサブプロシージャについては、以前から「データベース応答時間の計測 (ILE RPG V5R4 サブプロシージャ版)」や「RPG で C ランタイム関数を使用する」、「RPG で Java のメソッドを使用する」などで紹介してきました。。が、断片的だったようにも思うので、ここでちょっとまとめてみようかと思います。

まったく新しい独自の概念、というわけではありません。C でいう"関数"がほぼまったく同じもの、と理解しておいていいと思います。
(Java でいうと "メソッド"? "内部クラス"?? … まぁそんなかんじだと思ってください)

今回は、何回かにわけてサブプロシージャのいわば復習から、サブプロシージャの中からまたサブプロシージャを使いたい場合、サブプロシージャを共用する場合などに焦点を当てて紹介してみたいと思います。


C の関数との類似性

まず、最初に実際の C のプログラムを例に、「関数」がどう使われているかを見てみましょう。

C で書かれた、関数を使用した以下のようなプログラムを例に取ります。
(「C による統計データ解析入門」 縄田和満 東洋経済新報社という本が出典です。正直、あまり他意はなく、たまたま読んでいた本にちょうどよい例があった、ということなんですが…)

ここでは階乗の計算を factorial という関数にして、それを利用する形でコーディングされています。

/* Program 2-3(階乗の計算プログラム) */

#include <stdio.h>
double factorial(int n);

void main()
{
  double k;
  int n;
    n=5;
    k=factorial(n);
    printf("%d",n);
    printf("!=%g\n",k);
}

double factorial(int n)
{
   int i, m;
   double k;
   k=1;
     if(n == 0) 
     m=1;
     else 
     m=n;
   for(i=1; i<=m; i++) 
   k=k*i;
     return k;
}

上記の C のプログラムをかなり単純かつ忠実に ILE RPG に変換したものが↓になります。

TESTF

      *                                                                                             
      * CRTBNDRPG PGM(TESTF) SRCFILE(QRPGLESRC) DBGVIEW(*SOURCE)                                    
      *                                                                                             
     H DFTACTGRP(*NO)                                                                               
      *                                                                                             
     Dfactorial        PR             8f                                                            
     D p1                            10i 0                                                          
      *                                                                                             
     D k               S              8f                                                            
     D n               S             10i 0                                                          
      *                                                                                             
      /free                                                                                         
                                                                                                    
          n = 5 ;                                                                                   
          k = factorial(n) ;                                                                        
          dsply  %char(k) ;                                                                         
          return ;                                                                                  
                                                                                                    
      /end-free                                                                                     
      *                                                                                             
     Pfactorial        B                                                                            
     Dfactorial        PI             8f                                                            
     D n                             10i 0                                                          
     D i               S             10i 0                                                          
     D m               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                                                                            

これはそのまま単純に CRTBNDRPG コマンドを実行することによって、実行可能プログラムが作成されます。

関数の定義(宣言)

C のサンプルの最初にある factorial という関数の仕様についての宣言(プロトタイプ、といいます)

double factorial(int n);

は、ILE RPG では↓のようになります。

     Dfactorial        PR             8f                                                            
     D p1                            10i 0                                                          

実際の関数の中で行われる処理については

double factorial(int n)
{

で始まる部分で記述されています。
ILE RPG の場合は

     Pfactorial        B                                                                            
     Dfactorial        PI             8f                                                            
     D n                             10i 0                                                          

で始まる部分で記述されています。

このように C の関数と ILE RPG のサブプロシージャはかなり機械的に書き換えが可能です。
ほぼまったく対応するものと考えていいでしょう。

[Top Pageに戻る]

Ads by TOK2