这个功能是否在最近的Fortran标准版中提供?

时间:2013-10-28 18:29:03

标签: arrays fortran

由于阵列大小不匹配,我发现使用gcc v.4.4.6构建的代码无法运行时,我感到非常惊讶。使用gcc v.4.7.3构建时,它工作正常。我创建了一个最小的工作示例来显示问题的根源:

program main

   implicit none

   integer, allocatable, dimension(:,:) :: array_a
   integer, allocatable, dimension(:,:) :: array_b

   allocate(array_a(5,2))
   allocate(array_b(2,1))

   array_a = 1 

   array_b = array_a

   print *, array_a
   print *, array_b

end program main

使用gcc v.4.4.6构建时,它会在运行时因错误而崩溃:

  

在main.f90文件的第13行Fortran运行时错误:数组绑定   数组'array_b'(1/4)

的第1维的不匹配,大小不匹配

使用gcc v.4.7.3进行构建时,会产生以下输出:

  

1 1 1 1 1 1 1 1 1 1

     

1 1 1 1 1 1 1 1 1 1

注意,它会自动调整'array_b'的大小以匹配'array_a'的大小。这是我所看到的更新的Fortran标准提供的“功能”吗?

2 个答案:

答案 0 :(得分:6)

您正在使用Fortran 2003功能 - 分配时自动重新分配数组。它尚未在gcc-4.4中实现。

此功能意味着之前分配给不合格形状的数组b会自动重新分配到赋值右侧的形状。对于Fortran 2003功能,您必须使用最新的编译器版本(不仅仅是GCC)。

答案 1 :(得分:1)

正如弗拉基米尔所说,这是Fortran 2003的一个功能。如果你看一下2003 working document你会看到的第7.4.1.3节,

  

如果变量是已分配的可分配变量,如果 expr 是不同形状的数组或变量的任何相应长度类型参数值,则将其解除分配 expr 不同。如果 variable 是或者成为未分配的可分配变量,那么它将被分配,每个延迟类型参数等于 expr 的相应类型参数,形状为 expr ,每个下限等于LBOUND(expr)的对应元素。

注7.36显示,如果您希望array_b保持其形状,则需要将该行声明为

array_b(1:2,1) = array_a(3:4,2)

您想要的array_a元素。