在Fortran中分配不同形状的可分配对象

时间:2015-06-23 14:44:53

标签: fortran gfortran intel-fortran

请查看以下代码:

program test
implicit none

  integer, allocatable :: v1(:, :)
  integer, allocatable :: v2(:, :)

  allocate(v1(2, 4))
  allocate(v2(2, 3))
  v1(:, :) = reshape([11, 12, 13, 14, 15, 16, 17, 18], [2, 4])
  v2(:, :) = reshape([21, 22, 23, 24, 25, 26], [2, 3])

  print *, v1
  print *, 'shape(v1): ', shape(v1)
  print *
  print *, v2
  print *, 'shape(v2): ', shape(v2)
  print *

  v2 = v1

  print *, v1
  print *, 'shape(v1): ', shape(v1)
  print *
  print *, v2
  print *, 'shape(v2): ', shape(v2)
  print *

  deallocate(v1)
  deallocate(v2)
end program test

当我用 gfortran 编译它时,我得到以下输出:

11         12         13         14         15         16         17         18
shape(v1):            2           4

21         22         23         24         25         26
shape(v2):            2           3

11         12         13         14         15         16         17         18
shape(v1):            2           4

11         12         13         14         15         16         17         18
shape(v2):            2           4

当我用 ifort 编译它时,我得到以下输出:

11         12         13         14         15         16         17         18
shape(v1):            2           4

21         22         23         24         25         26
shape(v2):            2           3

11         12         13         14         15         16         17         18
shape(v1):            2           4

11         12         13         14         15         16
shape(v2):            2           3
哪一个可靠? ifort gfortran 中是否有错误?

gfortran version 4.8.1
ifort版本14.0.0

1 个答案:

答案 0 :(得分:4)

默认情况下,版本17之前的ifort不使用Fortran 2003语义来重新分配赋值左侧的可分配类型。 ifort 15手册就是这样说的(对于默认的norealloc-lhs假设):

  

编译器在解释赋值语句时使用标准Fortran规则。假设左侧被分配有正确的形状以保持右侧。如果不是,则会发生不正确的行为。

要允许将赋值的左侧重新分配到正确的形状,请使用选项-assume realloc-lhs进行编译。或者,您可以使用-standard-semantics进行编译,以使所有假设默认符合Fortran 2003标准,并具有一些Fortran 2008功能。