Arrays 两个数组构造函数相加的奇怪结果
我正在尝试下面的代码,它只是添加两个数组构造函数来获得一维数组。但是,根据这些表达式中是否使用了Arrays 两个数组构造函数相加的奇怪结果,arrays,fortran,Arrays,Fortran,我正在尝试下面的代码,它只是添加两个数组构造函数来获得一维数组。但是,根据这些表达式中是否使用了one(在隐含DO循环之外),我使用gfortran-5.3得到了(1)、(3)和(6)的错误结果。另一方面,ifort-14.0和Sun fortran 8.7为所有情况提供了正确的结果。奇怪的是,如果我尝试一个类似但更复杂的表达式,即使是Sun fortran也会表现出奇怪的行为(即,它在编译过程中被冻结…),因此我想知道我是否在这些表达式中使用了一些错误或危险的语法。有什么想法吗。。。?(顺便说
one
(在隐含DO循环之外),我使用gfortran-5.3得到了(1)、(3)和(6)的错误结果。另一方面,ifort-14.0和Sun fortran 8.7为所有情况提供了正确的结果。奇怪的是,如果我尝试一个类似但更复杂的表达式,即使是Sun fortran也会表现出奇怪的行为(即,它在编译过程中被冻结…),因此我想知道我是否在这些表达式中使用了一些错误或危险的语法。有什么想法吗。。。?(顺便说一句,如果我在两个构造函数之间只留下一个构造函数,它们总是按预期工作。)
ifort14.0和Sun Fortran 8.7的结果:
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
gfortran-5.3的结果:
1 1 0 1
1 1 1 1
1 1 0 1
1 1 1 1
1 1 1 1
1 1 0 1
1 1 1 1
当使用关联结构时,结果与预期一致
program main
use, intrinsic :: iso_fortran_env, only: &
compiler_version, &
compiler_options
implicit none
integer :: k
!integer, dimension(2), parameter :: zero = [0,0], one = [1,1]
integer, parameter :: N = 1
associate( zero => [0,0], one => [1,1] )
print *, [ one, ( zero, k=1,N) ] + [ ( zero, k=1,N), one ] !! (1)
print *, [ [1, 1], ( zero, k=1,N) ] + [ ( zero, k=1,N), [1, 1] ] !! (2)
print *, [ one, ([0, 0],k=1,N) ] + [ ([0, 0],k=1,N), one ] !! (3)
print *, [ [1, 1], ([0, 0],k=1,N) ] + [ ([0, 0],k=1,N), [1, 1] ] !! (4)
print *, [ 1, 1, ( 0, 0, k=1,N) ] + [ ( 0, 0, k=1,N), 1, 1 ] !! (5)
print *, [ one, ( 0, 0, k=1,N) ] + [ ( 0, 0, k=1,N), one ] !! (6)
print *, [ (one, k=1,1), (zero, k=1,N) ] + [ (zero, k=1,N), (one, k=1,1) ] !! (7)
end associate
print *, 'This result was compiled by ', &
compiler_version(), ' using the options ', &
compiler_options()
end program
使用GNU Fortran(Debian 5.3.1-14)5.3.1 20160409我得到
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
This result was compiled by GCC version 5.3.1 20160409 using the options -mtune=generic -march=x86-64 -O3 -Wall -std=f2008ts
“我觉得这些很好。”弗朗西斯卡勒斯:好的,非常感谢!删除parameter属性也会产生预期的结果。。。我已尝试删除“参数”,它也在我的计算机上给出了预期的结果(CentOS+gfort4.8或5)。因此,罪魁祸首似乎是参数属性。。。
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
This result was compiled by GCC version 5.3.1 20160409 using the options -mtune=generic -march=x86-64 -O3 -Wall -std=f2008ts