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

MvG*_*MvG 17 fortran exit-code exit gfortran

我正在修改一些我没有写过的Fortran代码,而且我自己没有很多的经验.我刚刚发现了一些情况,其中一些格式错误的输入被默默地忽略,并且想要更改该代码以做更合适的事情.如果这是C,那么我会做类似的事情

fprintf(stderr, "There was an error of kind foo");
exit(EXIT_FAILURE);
Run Code Online (Sandbox Code Playgroud)

但在fortran中,我知道如何做的最好看起来像

write(*,*) 'There was an error of kind foo'
stop
Run Code Online (Sandbox Code Playgroud)

缺乏输出流(次要问题)和退出状态(主要问题)的选择.

如何终止具有非零退出状态的fortran程序?

如果这是依赖于编译器的,那么与gfortran一起使用的解决方案会很好.

M. *_* B. 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
Run Code Online (Sandbox Code Playgroud)

虽然stop具有整数或字符串的功能与操作系统相关,但该语句是语言的一部分并且将始终进行编译. call exit是一个GNU扩展,可能不会链接到某些操作系统.


小智 10

除了停止n之外,自Fortran 2008以来还有错误停止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
Run Code Online (Sandbox Code Playgroud)