タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【AS400】RPGLE-ポインターによるパラメータ渡し

RPGでもポインターを利用できるようです。

あまり詳しくないのですが、構造体をパラメータにして別プログラムへ渡すためにポインターを使ってみました。

呼出し元(MAIN)のプロシージャでの処理

  • DATA1という名称の構造体を準備しました。構造体では、ID,NAME,MESSAGEのフィールドを保持しています。
  • 構造体に値をセットした後、%ADDR命令にて、ポインターを取得します。
POINTER = %ADDR(DATA1); 
  • なお、ポインターの変数定義では、下記のように、*を指定します。
     D  POINTER        S               *   
  • SUBプログラムを呼び出す際に、取得したポインターをパラメータで渡します。
CALLP SAMPLE13B (POINTER); 

呼出し先(SUB)のプロシージャでの処理

  • SUB側でも構造体を定義し、BASEDによりその構造体のポインターを指定できます。
     D DATA1           DS                  QUALIFIED        
     D                                     BASED(WKPOINTER) 
  • パラメータのポインターをBASEDで指定したポインター名(基底ポインター名)にセットさせることで、プロシージャー間で同一の内容の構造体を共有できるようになります。
WKPOINTER = P@POINTER;

ポインター渡しサンプル(MAIN)

     D SAMPLE13B       PR                  EXTPGM('SAMPLE13B') 
     D  PARMPOINT                      *                       
     D*                                                        
     D DATA1           DS                  QUALIFIED           
     D  ID                            4A                       
     D  NAME                         32                        
     D  MESSAGE                      10                        
     D*                                                        
     D  POINTER        S               *                       
     D*                                                        
     D******************************************************   
     D* MAIN                                                   
     D******************************************************   
      /FREE                                                    
          DATA1.ID ='1234' ;                                   
          DATA1.NAME = ' 山田 ';                               
          DATA1.MESSAGE = *BLANK ;                             
          DSPLY ('MAIN:' + DATA1.MESSAGE);     
                
          // 構造体 DATA1 のアドレス取得    
          POINTER = %ADDR(DATA1);           
                                            
          CALLP SAMPLE13B (POINTER);       
                                            
          DSPLY ('MAIN:' + DATA1.MESSAGE);  
                                            
          *INLR = *ON;                      
          RETURN;                           
      /END-FREE                             

ポインター渡しサンプル(SUB)

     H DFTACTGRP(*NO) ACTGRP(*NEW)                          
     D SAMPLE13B       PR                                   
     D                                 *                    
     D SAMPLE13B       PI                                   
     D  P@POINTER                      *                    
     D*                                                     
     D DATA1           DS                  QUALIFIED        
     D                                     BASED(WKPOINTER) 
     D  ID                            4A                    
     D  NAME                         32                     
     D  MESSAGE                      10                     
     D*                                                     
     D******************************************************
     D* MAIN                                                
     D******************************************************
      /FREE                                                 
          WKPOINTER = P@POINTER;                            
          DSPLY ('SUB:' + DATA1.ID);                        
          DSPLY ('SUB:' + DATA1.NAME);                      
          DATA1.MESSAGE = '感謝!!'; 
                                        
          *INLR = *ON;                  
          RETURN;                       
      /END-FREE                         

実行結果

> CALL SAMPLE13
   DSPLY  MAIN:
   DSPLY  SUB:1234
   DSPLY  SUB: 山田
   DSPLY  MAIN: 感謝!! 

サブPGM側では、MAINで設定された構造体の値を出力することができています。
さらにMAINに戻ってきてから、SUB側で設定されたMESSAGEを出力することができました!