2012-03-07 14 views
2

z/OS PL/I CONTROLLED変数は、プロシージャーの別々の呼び出しの間に保持されますか?サブルーチンの内部にあり、呼び出し全体で保持されているカウンタが必要であるとしましょう。これを行う最も簡単な方法は、ゼロに初期化され、サブルーチンへの各エントリでインクリメントされた静的変数を使用することです。しかし、プログラムがリエントラントでなければならない場合は、それを行うことはできません。したがって、問題は、以前の呼び出しで割り当てられた制御変数にアクセスできるかどうかです。次のコードは動作しますか? PL/I言語リファレンスによるとz/OS PL/I CONTROLLED変数は、プロシージャーの別々の呼び出しの間に保持されますか?

PROC1: PROCEDURE OPTIONS(MAIN); 
... 
CALL A; 
... 
A: PROCEDURE; 
DECLARE COUNT CONTROLLED ALIGNED FIXED BIN(15); 
IF (ALLOCATION(COUNT) = 0) 
    THEN ALLOCATE COUNT INIT(1); 
    ELSE COUNT = COUNT + 1; 
... 
END A; 

END PROC1; 

、変数をALLOCATEした後、あなたはすべての制御ストレージはの終わりに解放される」(つまり、一般的に良い習慣ですが)、それを解放する必要はありません。プログラム "と呼ばれています。ブロックの最後にストレージが解放されたとは言いません。 「PL/Iプログラミング・ガイド」では、「制御変数の位置指定」の「PLIDUMPの使用」の章にいくつかの手掛かりがありますが、確定的ではありません。制御変数を見つけるための鍵は、そのアンカーを見つけることです。 NORENT WRITABLEでは、静的記憶域にアンカーがあります。 NORENT NOWRITABLE(FWS)には、アンカー自動ストレージへのアドレスがあります。 NORTH NOWRITABLE(PRV)では、制御された各変数のプライベートテーブルにオフセットを持つ静的テーブルがあるようです。言い換えれば、処理オプションによっては、変数がアクセス可能である可能性があり、そうでない可能性があります。 RENTオプションの使用については何も言及していません。 考えていますか?

+0

これは、一般的な原則/アーキテクチャではなく特定のコーディングの問題をカバーするため、スタックオーバーフローでよりよく適合します。 –

+0

私の無知を許しますが、このコードはどの言語ですか?私はかなり古いものを想定していますが、それは何か分かりません。 – Bojangles

+0

言語はPL/Iです。 – zarchasmpgmr

答えて

0

「PL/Iプログラミングガイド」コンパイル時オプション「RENT」に従って、静的変数のいずれも変更しない場合、コードは「自然再入可能」です。

RENTオプションは、自然にリエントラントではないコードをコンパイラが受け取り、リエントラントにすることを指定します。

したがって、プログラムがRENTオプション付きでコンパイルされている場合は、各エントリのSTATIC変数をサブルーチンに増やすことができます。 J。K.による "PL/I構造化プログラミング" を1として

このリンクを参照してください=>Rent Option from PL/I Programming Guide

Hughes、REENTRANTプロシージャーは、他のプロシージャーによって非同期に呼び出されることがあります。例えば、タスクBはSQRT機能を呼び出す。この関数は平方根を計算中ですが、タスクA(タスクBより実行優先度が高い)はシステムの制御権を得てSQRT関数を使用する必要があります。 SQRT機能が中断され、タスクBの中間結果が保存されます。タスクAはSQRT関数を使用します。 タスクAの実行が完了すると、割り込みが発生した時点で制御がタスクBに戻されます。その後、タスクBはSQRT機能の使用を完了する。

関連する問題