RPG

408. RPGでポインタを学習する(2)

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