2

在处理一些遗留代码时,我发现了以下 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)

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

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

Fortran 函数说明

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

4

1 回答 1

6

DIMENSION用于向编译器指示该变量是一个数组。在这种情况下,DIMENSION CLIPG(1)声明CLIPG为一个元素的数组。它也被隐式类型为 be 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)

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

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

于 2012-11-23T17:31:20.890 回答