ポインタとは何かは先の「CLPでポインタを学習する(1)」で
解説した。
次にRPGでのポインタの定義の方法や使い方をいくつかの例を
挙げて紹介しよう。
最初に紹介するのはAPIへ渡すパラメータとして
ポインタ渡しを利用することである。
IBM API ではパラメータとして char* として定義されている
場合が多い。
char* とは C言語の変数の型で NULL-STOP と言って
最後はNULL文字( X’00’)で終わる文字列へのポインタのことを
意味する。
従って RPGプログラムから char* を渡すには組込み関数 %ADDR を
使ってポインタ渡しにしなければならない。
RPGの組込み関数 %ADDR とはフィールドのポインタを取得する組込み関数である。
[例] フィールド CFKEY のポインタは %ADDR(CFKEY) である。
[ RPG : TESTPUT ]
ソースはこちらから
0001.00 H DFTNAME(TESTPUT) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 F********** 環境変数に PUTENV ***************************************** 0003.00 F* 0004.00 F********************************************************************** 0005.00 0006.00 D*( PUTENV のプロトタイプ宣言 ) 0007.00 D PUTENV PR 10I 0 ExtProc('putenv') 0008.00 D ENVVAR * Value 0009.00 0010.00 D CFKEY_ S 7A 0011.00 D NULL S 1A INZ(X'00') 0012.00 D QUERY_STRING S 256A 0013.00 D QRY_STRING_P S * INZ(%ADDR(QUERY_STRING)) 0014.00 0015.00 C*( PUTENV QUERY_STRING=FKEY=CF03 + NULL を実行する ) 0016.00 C MOVEL(P) 'CF03' CFKEY_ 0017.00 /FREE 0018.00 QUERY_STRING = 'QUERY_STRING=FKEY=' + %TRIMR(CFKEY_) + NULL; 0019.00 PUTENV(QRY_STRING_P); 0020.00 /END-FREE 0021.00 C SETON LR 0022.00 C RETURN
[コンパイル]
CRTBNDRPG PGM(MYLIB/TESTPUT) SRCFILE(MYSRCLIB/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
[解説]
API: Qp0zPutEnv は環境変数を更新するAPIであり
次のようにパラメータはポインタ ENVVAR である。
0006.00 D*( PUTENV のプロトタイプ宣言 ) 0007.00 D PUTENV PR 10I 0 ExtProc('Qp0zPutEnv') 0008.00 D ENVVAR * Value
タイプ * はポインタであることを表している。
さてQRY_STRING_P はタイプがポインタとして定義されていて
0012.00 D QUERY_STRING S 256A 0013.00 D QRY_STRING_P S * INZ(%ADDR(QUERY_STRING))
として QUERY_STRING のポインタが QUERY_STRING_P である。
そこで
0017.00 /FREE 0018.00 QUERY_STRING = 'QUERY_STRING=FKEY=' + %TRIMR(CFKEY_) + NULL; 0019.00 PUTENV(QRY_STRING_P); 0020.00 /END-FREE
としてQUERY_STRINGの最後に NULL を付加してからボインタ QRY_STRING_P を
パラメータとして渡している。
このプログラムを CALL MYLIB/TESTPUT で実行すると
結果は
[ WRKENVVAR ]
環境変数 (*JOB) の処理 オプションを入力して,実行キーを押してください。 1= 追加 2= 変更 4= 除去 5= 詳細の表示 6= 印刷 OPT 名前 値 LANG '/QSYS.LIB/JA_5035.LOCALE ' > QUERY_STRING 'FKEY=CF03' 終わり パラメーターまたはコマンド ===> F3= 終了 F4=プロンプト F5= 最新表示 F9=コマンド 複写 F11=CCSID 表示 F12= 取消し F16=リスト 印刷 F17= 上部 F18= 下部 F22=フィールド 全体表示 (C) COPYRIGHT IBM CORP. 1980, 2007.
[解説]
環境変数として QUERY_STRING に FKEY=CF03 が正しく更新されている。
[今日のまとめ]
char* = %ADDR(%TRIMR(フィールド) + NULL)
[解説]
%TRIMR とは右側のブランクの文字列を除去するトリム関数である。