あまり詳しくないのですが、構造体をパラメータにして別プログラムへ渡すためにポインターを使ってみました。
呼出し元(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)
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を出力することができました!