isetjmp は longjmp の位置を設定します。longjmp は isetjmp で設定した位置に戻ります。
この組み込み関数は、次のように呼び出します。
ival = isetjmp( env ) |
|||
env |
INTEGER*4 |
出力 |
env は 12 要素の整数配列。64 ビット環境では、INTEGER*8 で宣言する必要がある |
戻り値 |
INTEGER*4 |
出力 |
ival = 0、isetjmp が明示的に呼び出された場合 ival ≠ 0、isetjmp が longjmp から呼び出された場合 |
サブルーチンは、次のように呼び出します。
call longjmp( env, ival ) |
|||
env |
INTEGER*4 |
入力 |
env は isetjmp で初期化された 12 語の整数配列。64 ビット環境では、INTEGER*8 で宣言する必要がある |
ival |
INTEGER*4 |
出力 |
ival = 0、isetjmp が明示的に呼び出された場合 ival ≠ 0、isetjmp が longjmp から呼び出された場合 |
isetjmp と longjmp ルーチンは、プログラムの低レベルルーチンで遭遇するエラーや障害を処置するために使用します。この 2 つは、f95 の組み込み関数です。
これらのルーチンは、最後の手段としてのみ使用してください。これらの取り扱いには、十分注意してください。 また、移植性はありません。バグやその他の詳細については、setjmp(3V) のマニュアルページを参照してください。
isetjmp は env にスタック環境を保存します。またレジスタ環境も保存します。
longjmp は、最後に isetjmp を呼び出して保存した環境を復元し、あたかも isetjmp の呼び出しが値 ival を返したかのように戻り、実行を継続します。
isetjmp から返された整数式 ival は、longjmp が呼び出されなければゼロです。longjmp が呼び出されれば、ゼロ以外になります。
例: isetjmp と longjmp を使用したコード部分
INTEGER*4 env(12) common /jmpblk/ env j = isetjmp( env ) if ( j .eq. 0 ) then call sbrtnA else call error_processor end if end subroutine sbrtnA INTEGER*4 env(12) common /jmpblk/ env call longjmp( env, ival ) return end |
longjmp を呼び出す前に isetjmp を起動します。
isetjmp と longjmp で使用される整数型の配列引数 env は、最低 12 個の要素からなる配列にします。
isetjmp を呼び出すルーチンから longjmp を呼び出すルーチンへ、共通ブロック経由であるいは引数として env 変数を渡します。
longjmp はスタックをクリーンアップしようとします。longjmp は isetjmp よりも低レベルのルーチンから呼び出します。
手続き名の引数として isetjmp を渡しても作用しません。
参照: setjmp(3V)