2

我现在正在尝试更新包含 (*) 等行的旧 Fortran 代码

allocate( a(2), b(2) )
a(:) = 0.0
b(:) = 0.0

最初,我将它们更改为

allocate( a(2), source=0.0 )
allocate( b(2), source=0.0 )

但这显然不是很简单。所以我试着把它们结合起来

allocate( a(2), b(2), source=0.0 )    !! (1)

我没想到它会起作用,但它实际上适用于 gfortran >=4.8 和 Sun fortran 8.7(而不适用于 ifort-14)。所以我浏览了F2003F2008文档的 ALLOCATE 部分,似乎在 F2008 中删除了“如果出现 SOURCE=,则分配列表应仅包含一个分配对象”的限制。这是否意味着上述第 1 行在 F2008 中没有问题,而不同的行为仅仅是由于 F2008 的支持程度不同?

(*) 在实际代码中,我试图分配派生类型的几个数组组件,allocate( conf% crd(3,N), conf% vel(3,N), conf% frc(3,N), blah, blah,... )同时为每个组件分配零。所以我想知道是否可以稍微简化这些行。

4

1 回答 1

2

在高层次上,是的,Fortran 2003 中对源分配中只有一个对象的限制在 Fortran 2008 中被删除。

现在,谈其他事情。首先,您不显示aand的声明b。在源分配中,要分配的对象必须与源类型兼容。简单的案例

real, allocatable, dimension(:) :: a, b
allocate( a(2), b(2) )
a(:) = 0.0
b(:) = 0.0

具有与 Fortran 2008 相同的效果

real, allocatable, dimension(:) :: a, b
allocate( a(2), b(2), source=0.0 )

但是关于

double precision, allocatable, dimension(:) :: a, b
allocate( a(2), b(2), source=0.0 )

?

之前的第二点是:Fortran 2008 是一个相对较新的东西。我不相信所有编译器都能在源分配中正确实现具有多个对象的规则。

于 2016-05-20T18:02:52.443 回答