Fortran具有stop
和error stop
,它们均会过早退出程序并可能返回错误代码。
两者之间有什么区别,什么时候应使用? (此外,这里是否有实现/编译器方面的问题?)
我从Intel's documentation了解到stop
终止了该程序,而error stop
似乎还有更多作用。该页面很有用,但不能完全回答我的问题,因为1)对我来说有点太技术性了,2)我知道Fortran标准在实现之间留有“艺术表达”的空间,所以我不信任该页面以完美反射(reflect)标准。
我注意到这个问题与What is the difference between "stop" and "exit" in Fortran?有关-实际上,我的问题是受this answer启发的。尽管这个问题询问了stop
和exit
之间的区别,但我专门研究stop
和error stop
之间的实质区别。回想起来,我在这里的问题将是对该问题的有用补充,但是由于并非如此,所以这是一个单独的问题。
最佳答案
Fortran有两种执行终止类型:正常终止和错误终止。
当到达stop
语句或end program
语句时,正常终止开始。错误终止由error stop
语句或其他形式的错误(例如输入/输出,分配或其他形式的错误)引起。
因此,最简单的方式是stop
语句启动正常终止,而error stop
语句启动错误终止。
如前所述,“终结”确实还有更多。
对于正常终止(无论是否通过stop
),分为三个阶段:启动,同步和完成。在单图像(非共阵列)程序中,这些东西从一个流向另一个。对于一个以上的图像,图像在启动后会进行同步,直到所有图像都开始正常终止为止。同步后,终止过程将完成。没有正常终止的“级联”。
对于错误终止,一旦一个图像启动此操作,所有尚未开始终止的所有其他图像将“尽快”经历(错误)终止。也就是说,一旦启动一个图像,整个程序就会崩溃。
这些方面与“处理器无关”,就某种程度而言,如果编译器是Fortran编译器,则它们遵循这些原则。但是,并非所有(所有版本)编译器都是当前标准的完整Fortran编译器。特别是,某些编译器不支持error stop
。如果不使用共数组,则两种形式的区别不那么重要。
在(至少)一个方面,允许编译器进行详细的更改。如果没有给出整数停止码,则在stop
上,标准建议将零值作为过程的退出码传递(支持这种概念)。如果没有在error stop
上给出整数停止码,则Fortran 2018建议将非零值作为退出码传递。
在链接的英特尔文档中,ifort遵循了第一条建议。
最后,error stop
语句可能出现在纯子程序中,而stop
语句(作为图像控制语句)被禁止。
关于fortran - STOP和ERROR STOP有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49544740/