概念性理解Fortran中的DIMENSION CLIPG(1)语句

时间:2012-11-23 16:38:22

标签: fortran

使用一些遗留代码时,我发现了以下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语言等价物?

1 个答案:

答案 0 :(得分:6)

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