【问题标题】:Allocatable arrays in fortran 77 and gfortranfortran 77 和 gfortran 中的可分配数组
【发布时间】:2014-05-30 22:20:48
【问题描述】:

我正在尝试使用 gfortran 编译一些旧的 fortran77 程序,并在可分配数组中遇到错误。 如果我以 f90 样式定义数组,例如:

REAL*8,allocatable::somearray(:)

一切都很好,但在那些旧程序中,数组定义为:

REAL*8  somearray[ALLOCATABLE](:)

导致gfortran错误输出的原因:

REAL*8,allocatable::somearray[ALLOCATABLE](:)                        
                             1
Fatal Error: Coarrays disabled at (1), use -fcoarray= to enable

我真的希望避免将整个程序重写为 f90 风格,所以,请你告诉我,有什么方法可以强制 gfortran 编译它吗? 非常感谢。

【问题讨论】:

  • 可分配数组是 Fortran 90 的一个特性。您显示的代码中导致错误的语法既不是 Fortran 77 也不是 Fortran 90。
  • 这完全不符合标准,我什至不会称它为 Fortran。
  • gfortran 认为 [] 表示 co-arrays,即 f90 或 f95 特征。但我根本不使用联合阵列。有没有办法强制 gfortran 只使用 f77 语法?所有这些程序都使用 f77 标准,并使用未知编译器编译。他们都使用我上面描述的数组定义。
  • 是的,搜索和替换会有所帮助,但我真的希望避免修改这些程序,因为它们仍然在带有接受这种奇怪的数组定义标准的 noname 编译器的 Windows 机器上使用。
  • 这不是 Fortran 77。这根本不是标准的 Fortran!

标签: fortran gfortran fortran77


【解决方案1】:

对于标准检查,您可以使用-std flag

-std=std 指定程序应遵循的标准,可以是f95',f2003'、f2008',gnu' 或 'legacy' 之一。

要“强制”gfortran 编译您的代码,您必须使用它识别的语法

【讨论】:

    【解决方案2】:

    我可能会去搜索和替换。例如,

      sed 's/\(REAL\*8\)[[:blank:]]\+\([^[]\+\)\[ALLOCATABLE\]\(.*\)/\1, allocatable :: \2\3/' <old.source> > <new.source>
    

    sed 在哪里可用。

    当然,小心 sed :)。

    无论如何,您的代码似乎是用旧的非标准版本编写的 Fortran,无论如何您都可能需要进行更改。

    【讨论】:

      【解决方案3】:

      英特尔 Fortran 编译器 (v13.something) 毫无怨言地编译了以下微程序。这会执行并将10 写入终端:

        REAL*8  somearray[ALLOCATABLE](:)
        allocate(somearray(10))
        print *, size(somearray)
        end
      

      鉴于英特尔编译器的历史,我怀疑这个奇怪的声明是 DEC Fortran 提供的扩展,可能是后来在 Fortran 90 中标准化的早期实现。

      【讨论】:

      • 是的,我认为它可能是 Intel Fortran 编译器。问题是 gfortran 在没有 -std=f95 的情况下无法理解其语法
      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 2015-08-08
      • 2011-02-18
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 2012-05-04
      • 2016-12-15
      相关资源
      最近更新 更多