下面的示例代码表示我遇到的问题。这是为了重现我遇到的问题,我可以做到最小/完整。我的问题是,相同的打印语句,相隔三行,产生两种不同的结果。第一个print语句产生正确的结果,而第二个产生错误的结果。我是否在这3行中重写变量定义?为什么当我将打印声明向下移动3行时,我会得到一个不同的,不正确的结果?打印报表如下所示。由于变量以某种方式被更改,这导致我的代码中的预期结果中出现很多问题。但是,我只是想了解这些印刷语句的最新情况。谢谢。
Module Sample
integer :: n,m
contains
subroutine Sub1(localf0)
implicit none
complex, dimension(-10:10,-10:10), intent(inout) :: localf0
complex, dimension(-10:10,-10:10) :: localf1
complex, dimension(-10:10,-10:10) :: Deriv0, Deriv1
Deriv0 = Deriv(localf0)
do while (norm2(abs(Deriv0)) > 0.000001)
print*, abs(localf1(1,1))-abs(localf0(1,1))
localf1 = localf0 +1.0*Deriv(localf0)
Deriv0 = Deriv(localf0)
Deriv1 = Deriv(localf1)
print*, abs(localf1(1,1))-abs(localf0(1,1))
end do
end subroutine Sub1
function Deriv(func)
implicit none
real :: x, y
complex, dimension(-10:10,-10:10), intent(in) :: func
complex, dimension(-10:10,-10:10) :: localf,Deriv
localf = func
do m=-9,9
do n=-9,9
x = real(n)*0.1
y = real(m)*0.1
localf(n,m)= cmplx(z1(x,y),z2(x,y))
end do
end do
do m=-9,9
do n=-9,9
Deriv(n,m) = (localf(n+1,m)+localf(n-1,m)+localf(n,m+1)+localf(n,m-1)-4*localf(n,m))/0.01
end do
end do
end function Deriv
End Module Sample
program MyProgram
use Sample
implicit none
complex, dimension(-10:10,-10:10) :: localf0,localf1
do m=-10,10
do n=-10,10
localf0(n,m) = cmplx(z1(real(n)*0.1,real(m)*0.1) , z2(real(n)*0.1,real(m)*0.1))
localf1 = localf0 + 1.0*Deriv(localf0)
end do
end do
call Sub1(localf0)
end program
答案 0 :(得分:3)
现在我已经运行它,这里有一个阴险的东西我坦率地认为编译器应该抛出错误。 (为什么我把它作为答案而不是评论)
你已经创建了n,m
模块变量,有效地使它们成为全局变量,并且在主程序循环和函数内部的循环中使用相同的n,m
。
您的函数deriv
更改n
和m
的值。 (它们作为最后一个循环的结束值返回),这样主程序循环就不会完成。
如果你放入主循环,你可以看到这个:
print*,m,n
localf1 = localf0 + 1.0*deriv(localf0)
print*,m,n
你得到:
-10 -10
10 10
并且循环退出..(10,10
比函数内的9,9
的循环限制多一个。)
您应该从模块中删除integer n,m
。在需要的地方声明n,m
个整数(在deriv
和MyProgram
中单独声明)
您可能还注意到,localf1
没有理由首先在主程序循环中分配(或者因为您从未使用过它而设置完毕)。删除该分配也可以解决问题,但我仍然建议将n,m
声明更改为本地。
请注意,修复后仍然存在while
循环的每次迭代都没有变化的问题,因此它会无限循环地打印相同的值。我想你想在循环结束时更新localf0=localf1
。