请查看以下代码:
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
答案 0 :(得分:4)
默认情况下,版本17之前的ifort
不使用Fortran 2003语义来重新分配赋值左侧的可分配类型。 ifort 15手册就是这样说的(对于默认的norealloc-lhs
假设):
编译器在解释赋值语句时使用标准Fortran规则。假设左侧被分配有正确的形状以保持右侧。如果不是,则会发生不正确的行为。
要允许将赋值的左侧重新分配到正确的形状,请使用选项-assume realloc-lhs
进行编译。或者,您可以使用-standard-semantics
进行编译,以使所有假设默认符合Fortran 2003标准,并具有一些Fortran 2008功能。