由于阵列大小不匹配,我发现使用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标准提供的“功能”吗?
答案 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
元素。