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

时间:2013-06-30 15:48:13

标签: fortran exit gfortran exit-code

我正在调整一些我没有写过的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 个答案:

答案 0 :(得分:20)

stop语句允许整数或字符值。似乎这些将在存在时输出到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扩展,可能不会链接到某些操作系统。

答案 1 :(得分:10)

除了 stop n 之外,自Fortran 2008以来还有错误停止。 在Windows下使用gfortran时,它们都会将错误号发送到操作系统,这可以通过后续echo %errorlevel%看到。语句错误停止也可以传递错误消息。

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

答案 2 :(得分:3)

我在gfortran 4.7.0 keyword index中找不到关于STOP的任何内容,可能是因为它是一个语言关键字,而不是内在关键字。然而,有一个EXIT intrinsic似乎正在寻找我正在寻找的东西:以给定状态退出。 the fortran wikia small example of using stderr,其中提到了ERROR_UNIT。所以现在我的代码现在看起来像这样:

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

这至少可以编译。测试仍然悬而未决,但它应该工作。如果有人知道更优雅或更合适的解决方案,请随意提供此问题的替代答案。