使用一些遗留代码时,我发现了以下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语法,我也不确定其含义。
也许DIMENSION CLIPG(1)
等同于REAL CLIPG
声明?什么是最接近的C语言等价物?
答案 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)
)
这意味着CLIPG2D
是something x 10
矩阵(Fortran按列存储矩阵),something
可能会有所不同。每当使用假定大小的数组时,还必须明确地向例程提供省略维度的大小。
在C语言中,您可以使用float clipg[]
或float *clipg
。