2

我惊讶地发现,由于数组大小不匹配,使用 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 Fortran 运行时错误的第 13 行:数组绑定不匹配,数组 '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 标准提供的“功能”吗?

4

2 回答 2

6

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

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

于 2013-10-28T18:54:45.997 回答
1

正如 Vladimir 所说,这是 Fortran 2003 的一个功能。如果您查看2003 工作文档的第 7.4.1.3 节,您会看到,

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

注 7.36 表明,如果要array_b保持其形状,则需要将线声明为

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

array_a你想要的任何元素。

于 2013-10-28T19:03:56.340 回答