2015-01-20 166 views
2

爲什麼我處於無限循環?調用函數時Fortran無限循環

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函數時發生無限循環,但我不明白爲什麼。 我認爲這與fortran使用公共變量有關,但我無法如何始終避免這種情況。 首先,我試圖調用沒有定義x的函數,只是使用「0.01 * i」,我想也許問題是這個函數使用了虛擬索引的相同名稱,但很明顯它並沒有解決問題。

+0

我不知道這是否是問題,但請注意'integer:y = 1'可能[不會](http://stackoverflow.com/q/14565739/3157076)你認爲它是什麼。 – francescalus 2015-01-20 21:52:35

+0

'taylerr'在哪裏使用?那麼爲什麼在後? – ja72 2015-01-25 00:15:51

回答

3

問題是內部功能然後fact(n)

n= n-1 

改變參數,並,因此,循環計數器itaylexp。在你的代碼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 
+1

或者甚至可能是'integer,intent(in),value :: n'並避免'nn'。 – francescalus 2015-01-20 21:54:17

+1

@francescalus是的,但我一次試圖解決一個問題;-)(除了隱式保存,這應該從標準禁止) – 2015-01-20 21:55:02

2

隨着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