ポインタとは何かは先の「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 とは右側のブランクの文字列を除去するトリム関数である。
