使用一些遗留代码时,我发现了以下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语法,我也不确定其含义.
也许DIMENSION CLIPG(1)
相当于REAL CLIPG
声明?什么是最接近的C语言等价物?
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
.
归档时间: |
|
查看次数: |
160 次 |
最近记录: |