【问题标题】:Stop fortran program with non-zero exit status以非零退出状态停止 fortran 程序
【发布时间】:2013-06-30 15:48:13
【问题描述】:

我正在修改一些我没有编写的 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 的解决方案会很好。

【问题讨论】:

    标签: fortran exit gfortran exit-code


    【解决方案1】:

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

    【讨论】:

    • 根据标准,“在终止时,停止代码(如果有)以处理器相关的方式可用。”
    【解决方案2】:

    除了stop n,还有error stop n,从Fortran 2008开始。 在 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 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)
      

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

      【讨论】:

      • STOP 是一个声明。 EXIT() 是 GNU 扩展,在其他编译器中可能不可用。
      猜你喜欢
      • 1970-01-01
      • 2015-04-30
      • 2022-06-21
      • 2019-08-06
      • 1970-01-01
      • 2019-10-08
      • 2017-05-18
      • 2013-12-23
      • 1970-01-01
      相关资源
      最近更新 更多