Fortran有stop
和error stop
,它们都提前退出程序并返回错误代码。
两者之间有什么区别,什么时候应该使用?(另外,这里有实现/编译器问题吗?)
我从Intel's documentation了解到,stop
终止了该计划,而error stop
似乎做了更多。那个页面很有用,但并不能完全回答我的问题,因为1)它对我来说有点太技术了,2)我知道Fortran标准在实现中为“艺术表达”留下了空间,所以我不这样做相信该页面能够完美地反映标准。
我注意到这个问题与What is the difference between "stop" and "exit" in Fortran?有关 - 事实上,我的问题受到了this answer对这个问题的启发。虽然该问题询问stop
和exit
之间的区别,但我特别关注stop
和error stop
之间的细微差别。回想起来,我的问题在这个问题上是一个有用的补充,但由于事实并非如此,这是一个单独的问题。
答案 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
内部模块获得。