使用 SOURCE= 一次分配多个变量
Allocate multiple variables at once with SOURCE=
我现在正在尝试更新我的旧 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)。所以我浏览了 F2003 and F2008 文档的 ALLOCATE 部分,似乎在 "If SOURCE= appears, allocation-list shall contain only one allocate-object" 的 F2008 中取消了限制。这是否意味着上面的第 1 行在 F2008 中没有问题,而不同的行为仅仅是由于 F2008 的支持程度不同?
(*) 在实际代码中,我试图分配派生类型的几个数组组件,allocate( conf% crd(3,N), conf% vel(3,N), conf% frc(3,N), blah, blah,... )
同时为每个组件分配零。所以我想知道是否可以稍微简化这些行。
在高层,是的,在 Fortran 2008 中删除了 Fortran 2003 中只有一个对象在来源分配中的限制。
现在,谈谈其他事情。首先,您不显示 a
和 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 是一个相对较新的东西。我不相信所有编译器都能在源分配中正确实现多个对象的规则。
我现在正在尝试更新我的旧 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)。所以我浏览了 F2003 and F2008 文档的 ALLOCATE 部分,似乎在 "If SOURCE= appears, allocation-list shall contain only one allocate-object" 的 F2008 中取消了限制。这是否意味着上面的第 1 行在 F2008 中没有问题,而不同的行为仅仅是由于 F2008 的支持程度不同?
(*) 在实际代码中,我试图分配派生类型的几个数组组件,allocate( conf% crd(3,N), conf% vel(3,N), conf% frc(3,N), blah, blah,... )
同时为每个组件分配零。所以我想知道是否可以稍微简化这些行。
在高层,是的,在 Fortran 2008 中删除了 Fortran 2003 中只有一个对象在来源分配中的限制。
现在,谈谈其他事情。首先,您不显示 a
和 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 是一个相对较新的东西。我不相信所有编译器都能在源分配中正确实现多个对象的规则。