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

    こちらで公開されているプログラム・コール・スタックの検索サンプルPGMですが、
    若干修正して、プログラム名をパラメータで受取り、該当のプログラムがスタックに存在するか調べ、
    存在した場合は、スタック中の位置を返すというサブプログラムを作ろうとしています。

    一応完成し、使用してみたのですが、QWVRCSTK APIの結果を見ると、OPMのみの場合は良いのです
    が、ILEの場合は一つのプログラムに対して、モジュールとプログラムの2つのエントリーが帰って
    きてしまいます。QWVRCSTKの戻り値で、ILEかOPMかを判断したいのですが、どの項目を使えば良いの
    かよく解かりません。

    どの項目を使ったら正しく判断できますか?

    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アドレス
タイトル
ホームページ
アドレス