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 一起使用的解决方案会很好。

4

3 回答 3

24

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 扩展,在某些操作系统上可能无法链接。

于 2013-06-30T18:27:46.827 回答
11

除了stop n之外,还有自 Fortran 2008 以来的错误 stop n。在 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
于 2013-09-16T13:39:24.523 回答
3

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

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

这至少可以编译。测试仍在进行中,但它应该可以工作。如果有人知道更优雅或更合适的解决方案,请随时为这个问题提供替代答案。

于 2013-06-30T16:10:23.807 回答