使用SOURCE =一次分配多个变量

时间:2016-05-20 17:41:02

标签: fortran fortran2003 fortran2008

我现在正在尝试更新包含像(*)

这样的行的旧Fortran代码
$v1 = preg_replace("($search)", "", $v1);

最初,我将它们改为

$v1 = preg_replace("/$search/", "", $v1);

但这显然不是那么简单。所以我试着将它们组合起来以便

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

我没想到它会起作用,但它实际上适用于gfortran&gt; = 4.8和Sun fortran 8.7(而不是ifort-14)。所以我浏览了F2003F2008文档的ALLOCATE部分,似乎在F2008中删除了限制&#34;如果SOURCE =出现, allocation-list < / em>只包含一个 allocate-object &#34;。这是否意味着上述第1行在F2008中没有问题,而且不同的行为仅仅是由于F2008的支持程度不同?

(*)在实际代码中,我试图分配派生类型的几个数组组件allocate( a(2), source=0.0 ) allocate( b(2), source=0.0 ) ,同时为每个组件分配零。所以我想知道是否有可能在某种程度上简化这些行。

1 个答案:

答案 0 :(得分:2)

在最高级别,是的,在Fortran 2003中限制了源分配中只有一个对象的限制在Fortran 2008中被删除。

现在,关于其他事项。首先,您不会显示ab的声明。在源分配中,要分配的对象必须与源类型兼容。简单的案例

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是一个相对较新的东西。我不相信所有编译器都能在源分配中正确实现具有多个对象的规则。