gpt4 book ai didi

Fortran 调用函数时无限循环

转载 作者:行者123 更新时间:2023-12-01 22:24:38 29 4
gpt4 key购买 nike

为什么我陷入无限循环?

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 函数时会进入无限循环,但我不明白为什么。我认为这与使用公共(public)变量的 fortran 有关,但我不知道如何始终避免这种情况。首先,我尝试在不定义 x 的情况下调用该函数,仅使用“0.01*i”,我想问题可能是该函数对虚拟索引使用了相同的名称,但显然它没有解决问题。

最佳答案

问题出在 then 函数 fact(n) 内部:

n= n-1

更改参数,从而更改 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

关于Fortran 调用函数时无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28055570/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com