RPG

480. *VARSIZEの使い方

プロシージャーのプロトタイプを宣言するときに使用する
OPTION(*VARSIZE)を使う方法について紹介する。
_

[例] C言語関数 sscanf のプロトタイプ

    D sprintf         PR            10I 0 EXTPROC('sprintf')      
    D  HTML_DATA                 32767A   OPTIONS(*VARSIZE)       
    D  FORMAT                         *   VALUE OPTIONS(*STRING)  
    D  ROW                          10I 0 VALUE  OPTIONS(*NOPASS) 
    D  COL                          10I 0 VALUE  OPTIONS(*NOPASS) 
    D  WIDTH                        10I 0 VALUE  OPTIONS(*NOPASS) 
    D  HEIGHT                       10I 0 VALUE  OPTIONS(*NOPASS) 
    D  IPADDR                         *   VALUE  OPTIONS(*NOPASS) 
    D  PATH                           *   VALUE  OPTIONS(*NOPASS) 

[解説]

このC言語の関数: sscanf は変数値をブランク区切りの複数の変数に
値を分割する関数であるがそのときにこの関数 : sscanf に与える変数値は
最大32767バイトまでの何バイトでも使えるように定義するために

  OPTIONS(*VARSIZE)

をパラメータのオプションとして宣言する。
これによって 1バイトから最大32767バイトまでの変数をこの関数に
定義することができるようになる。
同じプログラムの中で複数回の使用があり、しかも各使用する場面で
与える変数の長さが異なる場合に有効である。

 OPTIONS(*NOPASS) はこれが省略可能なパラメータであることを
 示している。

[例] RPG で QUIGETVを定義する

0120.00  *( QUIGETV : UIM 変数値の取得 )                            
0121.00 D QUIGETV         PR                  EXTPGM('QSYS/QUIGETV')
0122.00 D  HANDLE                        8A   CONST                 
0123.00 D  VARDTA                       10A   OPTIONS(*VARSIZE)     
0124.00 D  DTALEN                       10I 0 CONST                 
0125.00 D  VARRCD                       10A   CONST                 
0126.00 D  APIERR                             LIKEDS(APIERR)        
0127.00 D                                     OPTIONS(*VARSIZE)     

[解説]

これもAPI; QUIGETV を呼び出すためのプロトタイプであるが
受取り変数 : VARDTA の長さを

   VARDTA                       10A   OPTIONS(*VARSIZE) 

と 10バイトで定義しているが OPTIONS(*VARSIZE)で定義しているので
使用するときは何バイトの変数を使ってもかまわない。
このようにAPIなどの使用で使用する変数の長さが異なる場合に

 OPTIONS(*VARSIZE)

を使用すると可変の変数を使うことができるようになる。
ILE-RPGからAPIを呼び出すときにできる便利な方法である。
もちろん RPG IIIではこのような定義はできない。
RPG IIIからILE-RPGへは柔軟な機能が大幅に拡張されている。
_