我正在调整一些我没有写过的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一起使用的解决方案会很好。
答案 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 wiki有a 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)
这至少可以编译。测试仍然悬而未决,但它应该工作。如果有人知道更优雅或更合适的解决方案,请随意提供此问题的替代答案。