Fortran中维度CLIPG(1)语句的概念理解
在处理一些遗留代码时,我发现了以下Fortran函数声明。下面的代码段显示了函数声明和参数声明。我相信Fortran是一种不区分大小写的语言Fortran中维度CLIPG(1)语句的概念理解,fortran,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)
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
维度CLIPG(1)
语句的含义是什么
我发现对该语句的解释相当简洁,但主要作为一名C/C++程序员,我发现理解这个概念有些困难。请注意,REAL clipgr(1)、clipgl(1)
后面是一个括号(1)
。这是一个长度为1的数组,类型为REAL
堆栈溢出上还有一些其他链接,但即使是下面链接的帖子中给出的类似C的语法,我也不确定其含义
也许
DIMENSION CLIPG(1)
等同于REAL CLIPG
语句?最接近的C语言等价物是什么?维度用于向编译器指示变量是数组。在这种情况下,DIMENSION CLIPG(1)
将CLIPG
声明为一个元素的数组。它还隐式地键入为REAL
,因此等效的声明是:
REAL CLIPG(1)
等价的C构造是
..., float clipg[1], ...
请注意,这可能并不意味着CLIPG
实际上只是一个元素的数组。它还可以用作(一种非常糟糕的)向编译器解释CLIPG
是一个大小不同的数组的方式(例如,您可以使用5个元素的数组调用此子例程一次,然后使用50000个元素的数组再次调用此子例程)。它被声明为只有一个元素,因此编译器知道它是一个数组,但是如果实际的参数是一个更大的数组,那么它的访问可能会超出它的末尾。这是一种非常糟糕的做法,但您可以在许多非常古老的Fortran代码中找到它
FORTRAN 77提供了描述此类阵列的另一种方法:
REAL CLIPG(*)
或
这种数组称为假定大小的数组。只能将伪例程参数声明为假定大小数组,并且只能省略数组的最后一个维度,例如
DIMENSION CLIPG2D(10,*)
(但不是标注CLIPG2D(*,10)
)
这意味着CLIPG2D
是somethingx10
矩阵(Fortran按列存储矩阵),而something
可能会有所不同。每当使用假定大小数组时,还必须显式地向例程提供省略维度的大小
在C语言中,可以使用float-clipg[]
或float*clipg
你完全正确。检查代码时,似乎维度CLIPG(1)
被用作大小不同的数组。大小由NUMG
给出。谢谢你这么精明的回答。@NicholasKinar,请注意,如果使用更严格的编译器,这可能会导致编译器警告或错误。如果发生这种情况,只需将(1)
替换为(*)
,就可以了。或者您正在将代码移植到C?是的-我正在这么做,Hristo,不,我还没有将代码移植到C:-)顺便说一句,使用假定大小的数组以外的其他东西会更好吗?您也可以说:REAL-CLIPG(NUMG)
。您“更好”问:现代Fortran将使用假定的形状数组——用冒号声明。这会导致编译器传递带有形状信息的内部结构。另外,前面的一个相关问题显示了假定大小的一个缺点——运行时下标检查是不可能的:
DIMENSION CLIPG2D(10,*)