【问题标题】:End statement for Fortran elementsFortran 元素的结束语句
【发布时间】:2019-08-07 08:44:24
【问题描述】:

在 Fortran 77 或 Fortan 90 或 Fortran 2003 中,是否可以在没有对应的 end 语句的情况下结束以下结构,如下所示?

例如,是否可以只使用end 语句而不是end program 来结束程序?

子程序:结束子程序

函数:结束函数

模块:结束模块

程序:结束程序

如果:结束如果\endif

做:结束做\enddo

选择:结束选择\endselect

【问题讨论】:

    标签: fortran coding-style


    【解决方案1】:

    这有点复杂,但是当您包含编码样式标签时,我首先要说的是,我强烈建议在所有情况下都使用完整的表单 - 任何体面的编辑器都会自动神奇地适当地完成 End 语句。例如在 emacs 中,我使用的编辑器,在输入 End 后点击 tab 将自动添加所有文本。

    但是,在某些情况下,它在技术上不是必需的。对于 do、if、select、where 等控制结构,需要完整的形式。然而,对于程序和子程序,严格来说不是——事实上,最简单的 Fortran 程序只是

    End
    

    但是我建议不要这样做,因为完整的表格可以有效地记录程序,程序员几乎为零开销,这也意味着您不必记住何时需要完整的表格,何时不需要。

    我还要补充一下,当您包含编码样式标记时,完整形式实际上是指还包含程序/子程序名称或控件构造名称(如果使用)的表单。因此,我将编写一个“Hello World”程序作为

    Program hello_world
    
      Implicit None
    
      Write( *, * ) 'Hello World!'
    
    End Program hello_world
    

    最后我要补充一点,在这个时代,应该没有人使用 Fortran77,它已经过时了四分之一个世纪,Fortran90 也应该为新代码而退役。

    【讨论】:

      【解决方案2】:

      可以在程序单元和子程序/过程定义中使用朴素的end

      • end [program]
      • end [module]
      • end [submodule]
      • end [block data]
      • end [function]
      • end [subroutine]

      不允许将朴素的end 用于可执行结构、接口块或“赋值结构”或类型定义(基本上,其他任何地方):

      • end associate
      • end block
      • end critical
      • end do
      • end enum
      • end forall
      • end if
      • end interface
      • end selectselect caseselect rankselect type 中的每一个)
      • end team
      • end type
      • end where

      此外,对于第一个列表,在添加程序单元/过程名称时需要使用扩展形式:

      • end ... name

      请注意,我没有提及语言修订:其中一些问题甚至在 Fortran 77 中都不存在,而上面列表中的一些是 Fortran 2018 中的新问题。


      简单提一下风格,我对Ian Bush's answer无话可说。

      【讨论】:

      • 好点,没注意到!根据我的 MR&C(最新版),它应该只是 End Select - 这有点奇怪,因为它们是不同的构造
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多