新規投稿 記事一覧 ホーム
●ご利用方法,ご利用に際しての規約はこちらをお読みください。
こちらからの投稿は、先頭に表示されているコメントへの返信になります。
RE:34. プログラム・コール・スタックの検索サンプルPGMについて IKD さん [ 3月5日(水) 9時10分 ]

    ILE の場合は関数(プロシージャー) も、スタックのひとつになります。
    スタック上、プログラムとスタックの区別はありません。
    従ってILE の場合は、すべてのスタックを検索する必要があります。

    RE:34. プログラム・コール・スタックの検索サンプルPGMについて black さん [ 3月5日(水) 12時57分 ]

      質問の意図を読み取って頂けなかったようですので、詳細に書きます。

      プログラム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できないので、上記のような仕組みにしようとしています。

お名前
パスワード
e-mailアドレス
タイトル
ホームページ
アドレス