停止具有非零退出状态的Fortran程序。

21

我正在调整一些Fortran代码,但我并没有编写过这样的代码,也没有很多Fortran的经验。我发现某些畸形输入被默默地忽略了,想改变代码以执行更适当的操作。如果这是C语言的话,我会像这样做:

fprintf(stderr, "There was an error of kind foo");
exit(EXIT_FAILURE);

但在Fortran中,我所知道的最好方法是这样的

write(*,*) 'There was an error of kind foo'
stop

这个问题的一个小问题是缺少输出流的选择,而主要问题是缺少退出状态。

我如何终止一个Fortran程序并带有非零的退出状态?

如果这与编译器相关,则最好提供适用于gfortran的解决方案。

3个回答

24
< p > stop语句允许使用整数或字符值。当存在stderr时,这些值似乎很可能被输出到stderr,但由于stderr依赖于操作系统,因此Fortran语言标准不太可能要求这样做(如果它根本说了什么的话)。如果您使用数字选项,那么退出状态也很可能会被设置。我在Mac上使用gfortran尝试过,情况就是这样:

program TestStop

integer :: value

write (*, '( "Input integer: " )', advance="no")
read (*, *) value

if ( value > 0 ) then
   stop 0
else
   stop 9
end if

end program TestStop

stop后跟整数或字符串所做的确切操作取决于操作系统,但该语句是语言的一部分,始终可以编译。 call exit 是GNU扩展,可能在某些操作系统上无法链接。


根据标准规定,“在终止时,停止代码(如果有)以处理器相关的方式可用。” - astrojuanlu

11
除了Fortran 2008中的“stop n”之外,还有“error stop n”。在Windows下使用gfortran时,它们都会将错误号发送到操作系统,可以通过后续的“echo %errorlevel%”查看。语句“error stop”也可以传递一个错误消息。
program bye
    read *, n
    select case (n)
        case (1); stop 10
        case (2); error stop 20
        case (3); error stop "Something went wrong"
        case (4); error stop 2147483647
    end select
end program

3

gfortran 4.7.0关键字索引中,我找不到与STOP相关的任何内容,可能是因为它是一种语言关键字而不是内置函数。尽管如此,有一个EXIT内置函数似乎正是我所寻找的:退出并返回给定状态码。还有Fortran维基提供了一个使用stderr的小例子,其中提到了常量ERROR_UNIT。因此,我的代码现在看起来像这样:

USE ISO_FORTRAN_ENV, ONLY : ERROR_UNIT
[…]
WRITE(ERROR_UNIT,*) 'There as an error of kind foo'
CALL EXIT(1)

这份代码至少能够编译通过。尽管还需测试,但应该可行。如果有更简洁或更适合的解决方案,请随时提供此问题的替代答案。


5
STOP是一个语句。EXIT()是GNU的扩展,可能在其他编译器中不可用。 - Vladimir F Героям слава

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接