首页 > 解决方案 > 自动分配数组的正确语法

问题描述

我目前正在编写一个小的 Fortran 代码(90/03)。我对一个简单的语法有一个严重的怀疑:

INTEGER :: BB
DOUBLE PRECISION,DIMENSION(10) :: CC
INTEGER,DIMENSION(:),ALLOCATABLE :: AA
BB=10
... (many things to declare double precision values in CC)
AA=pack([( i,i=1,BB )],mask=CC.GT.0.0) ! size(CC,1)=BB

我可以使用这种语法吗?我需要AA在通话前分配pack吗?使用这种语法有风险吗?

标签: fortrangfortran

解决方案


语法是正确的(除了遗漏的部分,我们对此无能为力)。

我可以使用这种语法吗?

是的。

我需要AA在通话前分配pack吗?

不会。可分配的数组会在超出范围时自动分配和释放。不管右边的对象是任何函数的结果还是其他东西,例如文字数组。

使用这种语法有风险吗?

我想不出这里有什么风险。


我猜你对这条线感到困惑

AA=pack([( i,i=1,BB )],mask=CC.GT.0.0)

我将尝试解释它:

  1. [( i,i=1,BB )]通过隐式循环构建一个从 1 到 10 的整数数组。让我们称这个数组 B=B(i)
  2. mask=CC.GT.0.0只有前一个数组的元素 B(i) 被选择,其中 CC(i)>0 成立。
  3. pack(...)返回上一个结果的一维数组。

推荐阅读