为什么我陷入无限循环?
PROGRAM tayls
USE kertoma
USE tforexp
IMPLICIT NONE
INTEGER :: n= 5
INTEGER :: i
REAL :: x
WRITE(*,*) "f1(x)= (e**x-1)/x"
DO i=1,10
x= 0.01*i
WRITE(*,*)x, (taylexp(x,n)-1)/x
END DO
END PROGRAM tayls
和
MODULE tforexp
USE kertoma
IMPLICIT NONE
CONTAINS
FUNCTION taylexp(x,ord)
REAL :: taylexp, x, sum
INTEGER :: ord, i
sum= 1.0
DO i=1,ord
sum= sum+ x**i/fact(i)
END DO
taylexp= sum
END FUNCTION taylexp
END MODULE tforexp
和
MODULE kertoma
IMPLICIT NONE
CONTAINS
FUNCTION fact(n)
INTEGER :: fact,n,y=1
DO WHILE (n>1)
y= y*n
n= n-1
END DO
fact = y
END FUNCTION fact
END MODULE kertoma
无限循环从第一次打印“ f1(x)= ...”开始。因此,我认为首次调用taylexp-function时会进入无限循环,但是我不明白为什么。我认为这与使用公共变量的fortran有关系,但是我不知道如何始终避免这种情况。首先,我尝试仅使用“ 0.01 * i”而不定义x来调用该函数,并且我认为问题可能在于该函数对虚拟索引使用了相同的名称,但显然它不能解决问题。
问题是在里面然后函数fact(n)
:
n= n-1
改变了说法,因此,循环计数器i
在taylexp
。在您的代码中i
永不超过2
。我很惊讶编译器没有发出警告(我的也没有),因为在这种情况下可能会发生任何事情。
最好指定intent
伪参数的值,以避免将来出现类似问题:
FUNCTION fact(n)
integer,intent(in) :: n
INTEGER :: fact,nn,y
y=1 ! Avoid the implicit save and assign variables separately
nn=n
DO WHILE (nn>1)
y= y*nn
nn= nn-1
END DO
fact = y
END FUNCTION fact
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句