質問の意図を読み取って頂けなかったようですので、詳細に書きます。
プログラムA,B,Cがあり、それぞれがA,B,Cを呼び出す場合、自分より上位に位置するプログラムがス タックに存在する場合、再帰呼び出しでエラーになります。 そのため、スタックを検索し、 1)該当のプログラムがスタック中に存在するかどうかを調べ 2)存在する場合、スタック中の位置を返す というサブプログラムを作り、これから実行しようとするプログラムを調べ、 スタックに存在する場合は、CALLせずに終了して上位に戻そうと考えました。
しかし、ILEの場合、プログラムとプロシジャと複数出来てしまうので、全てカウントしてしまうと 位置情報が正しくなくなるのです。
スタックが以下の時、 OPM PGMa PGMb PGMc
ILE PGMa PGMa(プロシジャ) PGMb PGMb(プロシジャ) PGMc PGMc(プロシジャ)
PGMcからPGMaを呼び出す時、既にスタックに居るのでCallできません。 よって、PGMc→PGMb→PGMaと戻らなければなりません。 各プログラムのパラメータにリターンコードを設け、ゼロ以外が戻された 場合、戻りたい階層を示すようにしました。 呼出し後、リターンコードを-1しても整数の場合、自分より上位に戻りたいことが解かります。 スタックを検索して、PGMaは3番目である事を戻したいのですが、OPMなら 正しいですが、ILEの場合、6になってしまいます。
スタックを検索する時に、モジュールをカウントさせたくないのですが、 ILEのプログラムとモジュールを区別するには、APIの戻り値上、どこを見て 判断したらよいでしょうか?
RPGではTFRCTLできないので、上記のような仕組みにしようとしています。
|