【问题标题】:Conceptual understanding of DIMENSION CLIPG(1) statement in FortranFortran中DIMENSION CLIPG(1)语句的概念理解
【发布时间】:2023-03-29 22:45:02
【问题描述】:

在处理一些遗留代码时,我发现了以下 Fortran 函数声明。下面的 sn-p 显示了函数声明和参数声明。我相信 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 的语法中,我也不确定其含义。

Fortran Function explanation

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

【问题讨论】:

    标签: fortran


    【解决方案1】:

    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)

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

    在 C 中可以使用float clipg[]float *clipg

    【讨论】:

    • 你是绝对正确的。检查代码,DIMENSION CLIPG(1) 似乎被用作不同大小的数组。大小由NUMG 给出。谢谢你这么精明的回答。
    • @NicholasKinar,请注意,如果使用更严格的编译器,这可能会导致编译器警告或错误。如果发生这种情况,只需将(1) 替换为(*) 就可以了。或者您正在将代码移植到 C 中?
    • 是的 - 我只是这样做,Hristo,不,我还没有将代码移植到 C :-) 顺便说一句,使用假定大小数组以外的其他东西会更好吗?
    • 你也可以说:REAL CLIPG(NUMG).
    • 关于“更好”的问题:现代 Fortran 将使用假定的形状数组——用冒号声明。这会导致编译器传递带有形状信息的内部结构。附言一个相关的先前问题显示了假定大小的缺点——运行时下标检查是不可能的:stackoverflow.com/questions/9840693/…
    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2020-10-26
    相关资源
    最近更新 更多