主题:[讨论]语句函数对数组赋值出现的一个很奇怪的问题
PROGRAM assign_inlinefun2mat
!
implicit none
!
real,dimension(3) :: m = (/0.2,0.4,0.6/),v
real :: r
integer :: i
!
!线性内插
real :: a0,a1,position,interp
interp(a0,a1,position) = a0*(1.0-position)+a1*position
!
!直接赋值
v = 0.0
print*,'----part1----'
do i = 1,3
print*,'----start----'
print*,'v=',v
print*,'interp(0,1,m(i))=',interp(0,1,m(i))
v = interp(0,1,m(i))
print*,'----assign----'
print*,'v=',v
print*,'interp(0,1,m(i))=',interp(0,1,m(i))
end do
!
!通过变量间接赋值
v = 0.0
print*,'----part2----'
do i = 1,3
print*,'----start----'
print*,'v=',v
print*,'interp(0,1,m(i))=',interp(0,1,m(i))
r = interp(0,1,m(i))
v=r
print*,'----assign----'
print*,'v=',v
print*,'interp(0,1,m(i))=',interp(0,1,m(i))
end do
!
END PROGRAM assign_inlinefun2mat
windows下 CVF 6.5的结果:
[color=FF0000] ----part1----
----start----
v= 0.0000000E+00 0.0000000E+00 0.0000000E+00
interp(0,1,m(i))= 0.2000000
----assign----
v= 0.0000000E+00 0.0000000E+00 0.0000000E+00
interp(0,1,m(i))= 0.2000000
----start----
v= 0.0000000E+00 0.0000000E+00 0.0000000E+00
interp(0,1,m(i))= 0.4000000
----assign----
v= 0.2000000 0.2000000 0.2000000
interp(0,1,m(i))= 0.4000000
----start----
v= 0.2000000 0.2000000 0.2000000
interp(0,1,m(i))= 0.6000000
----assign----
v= 0.4000000 0.4000000 0.4000000
interp(0,1,m(i))= 0.6000000 [/color]
----part2----
----start----
v= 0.4000000 0.4000000 0.4000000
interp(0,1,m(i))= 0.2000000
----assign----
v= 0.2000000 0.2000000 0.2000000
----start----
v= 0.2000000 0.2000000 0.2000000
interp(0,1,m(i))= 0.4000000
----assign----
v= 0.4000000 0.4000000 0.4000000
----start----
v= 0.4000000 0.4000000 0.4000000
interp(0,1,m(i))= 0.6000000
----assign----
v= 0.6000000 0.6000000 0.6000000
linux下ifort 11.0的结果:
----part1----
----start----
v= 0.0000000E+00 0.0000000E+00 0.0000000E+00
interp(0,1,m(i))= 0.2000000
----assign----
v= 0.2000000 0.2000000 0.2000000
interp(0,1,m(i))= 0.2000000
----start----
v= 0.2000000 0.2000000 0.2000000
interp(0,1,m(i))= 0.4000000
----assign----
v= 0.4000000 0.4000000 0.4000000
interp(0,1,m(i))= 0.4000000
----start----
v= 0.4000000 0.4000000 0.4000000
interp(0,1,m(i))= 0.6000000
----assign----
v= 0.6000000 0.6000000 0.6000000
interp(0,1,m(i))= 0.6000000
----part2----
----start----
v= 0.0000000E+00 0.0000000E+00 0.0000000E+00
interp(0,1,m(i))= 0.2000000
----assign----
v= 0.2000000 0.2000000 0.2000000
interp(0,1,m(i))= 0.2000000
----start----
v= 0.2000000 0.2000000 0.2000000
interp(0,1,m(i))= 0.4000000
----assign----
v= 0.4000000 0.4000000 0.4000000
interp(0,1,m(i))= 0.4000000
----start----
v= 0.4000000 0.4000000 0.4000000
interp(0,1,m(i))= 0.6000000
----assign----
v= 0.6000000 0.6000000 0.6000000
interp(0,1,m(i))= 0.6000000
在CVF里直接用语句函数对数组赋值,得到的实际上是上一个循环的结果(结果里红色的部分),如果先把语句函数的结果赋给一个变量,再将该变量赋给数组就没有这个问题,ifort里则不管怎么赋值都没有问题。
本来这样赋值应该算一种错误,不过这个结果实在有些诡异,冒昧的发上来,请各位高手分析下为什么会得到的是上一个循环的值。