使用某些旧代码时,我发现了以下Fortran函数声明。下面的代码片段显示了函数声明和参数声明。我相信Fortran是不区分大小写的语言。

 SUBROUTINE CLIP2G (fcut,TIME,NUMS,NUMG,CLIPG,CLIPGL,CLIPGR,MODE,PHZ)

      real fcut, TIME,
      integer NUMS, NUMG
      DIMENSION CLIPG(1)
      REAL clipgr(1),clipgl(1)
      INTEGER MODE
      LOGICAL PHZ


DIMENSION CLIPG(1)语句的含义是什么?

我找到了一个link语句的相当简洁的解释,但是主要是作为C / C ++程序员,我发现该概念很难理解。请注意REAL clipgr(1), clipgl(1)后跟方括号(1)的方式。这是长度为1且类型为REAL的数组吗?

在Stack Overflow上还有其他一些链接,但即使在下面的链接中给出的类似C的语法中,我也不确定其含义。

Fortran Function explanation

也许DIMENSION CLIPG(1)等同于REAL CLIPG语句?最接近的C语言等效语言是什么?

最佳答案

DIMENSION用于向编译器指示该变量是一个数组。在这种情况下,DIMENSION CLIPG(1)声明CLIPG为一个元素的数组。它还隐式地键入为REAL,因此等效声明为:

REAL CLIPG(1)


等效的C构造为

..., float clipg[1], ...




请注意,这可能并不意味着CLIPG实际上只是一个元素的数组。它也可以用作(非常糟糕的)方式向编译器解释CLIPG是大小可变的数组(例如,您可以使用5个元素的数组调用此子例程一次,然后使用50000的数组再次调用此子例程元素)。它被声明为只有一个元素,因此编译器知道它是一个数组,但是如果实际参数是一个更大的数组,则可以超出其末尾对其进行访问。这是一个非常糟糕的做法,但是您可以在许多非常古老的Fortran代码中使用它。

FORTRAN 77提供了另一种描述此类数组的方法:

REAL CLIPG(*)


要么

DIMENSION CLIPG(*)


这样的数组称为假定大小数组。只能将伪例程参数声明为假定大小的数组,并且只能省略该数组的最后一个维度,例如

DIMENSION CLIPG2D(10,*)


(但不是DIMENSION CLIPG2D(*,10)

这意味着CLIPG2Dsomething x 10矩阵(Fortran按列存储矩阵),并且something可能会有所不同。每当使用假定大小的数组时,还必须向例程明确提供省略的维的大小。

在C语言中,可以使用float clipg[]float *clipg

关于fortran - 对Fortran中的DIMENSION CLIPG(1)语句的概念理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13532900/

10-10 18:19