RPGではLR-終了しても自分自身が終了して呼び出し元の
スタックに戻るだけであり呼び出し元の上位のプログラムは
終了しない。
親プログラムから子プログラムを呼び出して
子プログラムの画面で「F3=終了」と記述されているので
エンド・ユーザーはF3キーを押して終了しても
その子プログラムが終了するだけであり
親プログラムの元の画面に戻るだけである。
長年のRPGプログラマーはこれは当たり前のことと思っているかもしれないが
実はそうでもない。
_
これは操作しているエンド・ユーザーから見れば
あたかもF12キーで前の画面に戻っただけの
ように見えてしまう。
内部で子プログラムが呼ばれていたとはエンド・ユーザーには
わからないからである。
プログラマーは子プログラムが終了しただけだと見るかもしれないが
エンド・ユーザーから見れば F3=終了キーを押したのに
前の画面に戻っただけでこれは終了ではないと感じるだろう。
なぜこのF3=終了にこだわるのかと言うと
C言語の場合は通常は
exit(0);
という命令で終了するのが普通であるがこの exit(0); というC言語の
終了命令では上位の呼び出し元のプログラムも含めて
すべて終了させてしまう。
そこでRPGでもC言語と同じように呼び出し元も腹鳴すべて
終了させてしまうことができないかと調べた。
API: CEETREC というAPIが C言語の exit(0) と同じ機能を
提供してくれることが判明した。
これはサービス・プログラムの中で呼び出しても
親プログラムのスタックもすべて終了させてくれる優れものである。
興味のある人は一度実験してみると良いだろう。
また子プログラムの F3=終了では単なる *INLRを*ONにするのではなく
API : CEETREC を呼び出せば親プログラムのスタックまて含めて
すべて終了させてくれる。
_
[ TESTCEE : 終了テスト ]
ソースはこちらから
0001.00 H DFTNAME(TESTCEE) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 F********** 親プログラムも終了させる ********************************* 0003.00 F* 0004.00 F********************************************************************** 0005.00 0006.00 D*( CEETREC のプロトタイプ宣言 ) 0007.00 D CEETREC PR 4B 0 0008.00 D CEL_RC_MOD 10I 0 OPTIONS(*OMIT) 0009.00 D USER_RC 10I 0 OPTIONS(*OMIT) 0010.00 0011.00 /FREE 0012.00 *INLR = *ON; 0013.00 CEETREC(*OMIT:*OMIT); 0014.00 /END-FREE 0015.00 C RETURN![]()
[解説]
テストするにはこのプログラムを呼び出す上位のプログラムを作って
このプログラムを呼び出すテストをしてみればよい。
このテスト・プログラムを実行して終了すると親プログラムまで
一緒に終了することを体験することができるだろう。
*INLR のセットはこれをを書かないとコンパイル・エラーになる可能性があるので
あえて記述している。