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

Nic*_*nar 2 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
Run Code Online (Sandbox Code Playgroud)

DIMENSION CLIPG(1)声明的含义是什么?

我找到了一个链接到该声明的相当简洁的解释,但主要是作为一个C/C++程序员,我发现这个概念有点难以理解.注意如何REAL clipgr(1), clipgl(1)跟一个括号(1).这是一个长度= 1的数组REAL吗?

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

Fortran功能说明

也许DIMENSION CLIPG(1)相当于REAL CLIPG声明?什么是最接近的C语言等价物?

Hri*_*iev 6

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

REAL CLIPG(1)
Run Code Online (Sandbox Code Playgroud)

等价的C构造将是

..., float clipg[1], ...
Run Code Online (Sandbox Code Playgroud)

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

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

REAL CLIPG(*)
Run Code Online (Sandbox Code Playgroud)

要么

DIMENSION CLIPG(*)
Run Code Online (Sandbox Code Playgroud)

这种数组称为假定大小数组.只有虚拟例程参数可以声明为假定大小的数组,并且只能省略数组的最后一个维度,例如

DIMENSION CLIPG2D(10,*)
Run Code Online (Sandbox Code Playgroud)

(但不是DIMENSION CLIPG2D(*,10))

这意味着它CLIPG2D是一个something x 10矩阵(Fortran 以矩阵形式存储矩阵),并且something可能会有所不同.每当使用假定大小的数组时,还必须明确地向例程提供省略的维度的大小.

在C中,可以使用float clipg[]或者float *clipg.