Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用函数时的Fortran无限循环_Fortran_Infinite Loop_Fortran95 - Fatal编程技术网

调用函数时的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