Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran中维度CLIPG(1)语句的概念理解_Fortran - Fatal编程技术网

Fortran中维度CLIPG(1)语句的概念理解

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)

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