调用函数时的Fortran无限循环
为什么我在一个无限循环中调用函数时的Fortran无限循环,fortran,infinite-loop,fortran95,Fortran,Infinite Loop,Fortran95,为什么我在一个无限循环中 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 tf
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
及
无限循环在第一次打印“f1(x)=…”之后立即开始。
所以我认为第一次调用taylexp函数时它会进入无限循环,但我不明白为什么。
我认为这与使用公共变量的fortran有关,但我不知道如何始终如一地避免这种情况。
首先,我尝试在不定义x的情况下调用该函数,只使用“0.01*I”,我认为问题可能在于该函数对虚拟索引使用了相同的名称,但它显然没有解决问题 问题在函数内部
事实(n)
:
更改参数,从而更改taylexp
中的循环计数器i
。在您的代码中,i
从不超过2
。我很惊讶编译器没有发出警告(我的也没有),因为在这种情况下可能会发生任何事情
最好指定伪参数的意图
,以避免将来出现类似问题:
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
使用gfortran,可以通过 -fcheck=all选项:
$ gfortran -fcheck=all 1.f90
$ ./a.out
f1(x)= (e**x-1)/x
At line 22 of file 1.f90
Fortran runtime error: Loop variable has been modified
我不知道这是否是问题所在,但请注意,
integer::y=1
可能是您认为它的作用。在哪里使用了taylerr
?为什么会出现在帖子中?或者甚至可能是integer,intent(in),value::n
并避免nn
@francescalus是的,但我试图一次解决一个问题;-)(除隐式保存外,标准中应禁止隐式保存)
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
$ gfortran -fcheck=all 1.f90
$ ./a.out
f1(x)= (e**x-1)/x
At line 22 of file 1.f90
Fortran runtime error: Loop variable has been modified