isetjmp 为 longjmp 设置位置;而 longjmp 返回到该位置。
该内函数的调用方式如下所示:
ival = isetjmp( env ) |
|||
env |
INTEGER*4 |
输出 |
env 是由 12 个元素组成的整数数组。在 64 位环境中,它必须声明为 INTEGER*8。 |
返回值 |
INTEGER*4 |
输出 |
如果显式调用 isetjmp,ival = 0 如果通过 longjmp 调用 isetjmp,ival ≠ 0 |
该子例程的调用方式如下所示:
call longjmp( env, ival ) |
|||
env |
INTEGER*4 |
输入 |
env 是由 isetjmp 初始化并由 12 个元素组成的整型数组。在 64 位环境中,它必须声明为 INTEGER*8 |
ival |
INTEGER*4 |
输出 |
如果显式调用 isetjmp,ival = 0 如果通过 longjmp 调用 isetjmp,ival ≠ 0 |
isetjmp 和 longjmp 例程用于处理在程序的低级例程中遇到的错误和中断。它们属于 f95 内函数。
如非必要,不应使用这些例程。它们受规范约束,且不可移植。有关错误和其他详细信息,请参见 setjmp(3V) 手册页。
isetjmp 在 env 中保存堆栈环境。它还会保存寄存器环境。
longjmp 会恢复上次调用 isetjmp 时保存的环境,并以继续执行这种方式返回值,就好像刚执行 isetjmp 调用返回 ival 值一样。
如果未调用 longjmp,从 isetjmp 返回的整型表达式 ival 为零,如果调用了 longjmp,则返回的 ival 不为零。
示例:使用 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 |
必须先调用 isetjmp,然后才能调用 longjmp。
isetjmp 和 longjmp 的 env 整型数组参数长度必须至少为 12 个元素。
必须以常规方式或通过参数将 env 变量从调用 isetjmp 的例程传递给调用 longjmp 的例程。
longjmp 会尝试清理堆栈。必须从较低的调用级别而不是 isetjmp 调用 longjmp。
不能将 isetjmp 作为属于过程名称的参数进行传递。
请参见 setjmp(3V)。