STOP和ERROR STOP之间有什么区别?

时间:2018-03-28 21:49:48

标签: fortran

Fortran有stoperror stop,它们都提前退出程序并返回错误代码。

两者之间有什么区别,什么时候应该使用?(另外,这里有实现/编译器问题吗?)

我从Intel's documentation了解到,stop终止了该计划,而error stop似乎做了更多。那个页面很有用,但并不能完全回答我的问题,因为1)它对我来说有点太技术了,2)我知道Fortran标准在实现中为“艺术表达”留下了空间,所以我不这样做相信该页面能够完美地反映标准。

我注意到这个问题与What is the difference between "stop" and "exit" in Fortran?有关 - 事实上,我的问题受到了this answer对这个问题的启发。虽然该问题询问stopexit之间的区别,但我特别关注stoperror stop之间的细微差别。回想起来,我的问题在这个问题上是一个有用的补充,但由于事实并非如此,这是一个单独的问题。

3 个答案:

答案 0 :(得分:7)

Fortran有两种类型的执行终止:普通终止和错误终止。

当达到stop语句或结束程序语句时,正常终止开始。错误终止伴随着error stop语句或其他形式的错误(例如输入/输出,分配或其他此类形式)。

因此,以最简单的方式,stop语句启动正常终止,error stop语句启动错误终止。

如上所述,确实有更多的终止"。

对于正常终止(无论是否通过stop),有三个阶段:启动,同步和完成。在单图像(非共同)程序中,这些事物从一个流向另一个。对于多个图像,图像在启动后同步,直到所有图像开始正常终止。同步后,终止过程完成。没有"级联"正常终止。

对于错误终止,一旦一个图像启动,所有进程(尚未开始终止)都会经历(错误)终止。也就是说,一旦一个图像开始播放,整个程序就会停止运行。

这些方面不依赖于处理器",如果编译器是Fortran编译器,它遵循这些方面。但是,并非所有(所有版本的)编译器都是当前标准的完整Fortran编译器。特别是,许多编译器不支持error stop。如果没有共同实施,这两种形式的区别就不那么重要了。

有(至少)一个方面允许编译器的细节变化。如果没有给出整数停止代码,则在stop上标准建议将零值作为流程的退出代码传递(支持这样的概念)。如果error stop上没有给出整数停止代码,则草拟Fortran 2018建议将非零值作为退出代码传递。

在链接的英特尔文档中,ifort遵循此第一条建议。

最后,Fortran 2018草案允许error stop在纯子程序中,但不允许stop

答案 1 :(得分:5)

Error stop(显然是?)意味着在程序错误终止的情况下使用,而stop用于终止程序,即使在正常情况下也是如此。有些人甚至习惯在每个stop之前写end

error stop与coarray一起在Fortran 2008中引入,对于停止所有正在运行的图像(进程)很有用,而stop只是停止执行当前图像。

stop pure可以使用<error stop {{1}},{{1}}可以使用{{1}}。{/ p>}

答案 2 :(得分:4)

添加@Vladimir F的好答案,声明

error stop [ stop-code ]  ! stop-code is an integer or default character constant expression and has the same meaning as for the stop statement.

在并行程序中的结果比简单的stop更严重。当在一个coarray映像(处理器,线程......)上执行时,它会在那里启动错误终止,从而导致尚未启动错误终止的所有其他映像启动错误终止。它会导致整个计算尽快停止。因此,当其中一个图像中的严重错误导致整个模拟对其余图像无用时,error stop应该用于并行编程。

相反,就我所知并在Coarray Fortran中使用它而言,单个stop语句仅停止那些已到达它的图像。其他图像可以使用

检查特定图像或已失败(停止)的图像的状态
sync images([image numbers],stat=syncstat)
if (syncstat==stat_stopped_image) then
   ! do something appropriate
end if

标志stat_stopped_image是一个常量,可从Fortran 2008中的iso_fortran_env内部模块获得。