プロシージャーのプロトタイプを宣言するときに使用する
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へは柔軟な機能が大幅に拡張されている。
_