2016-07-23 59 views
0

我在兩個單獨的文件Code :: Blocks中編寫了GNU Fortran代碼:main.f95,example.f95。 main.f95內容:Fortran:調用函數中的其他函數

program testing 

    use example 

    implicit none 
    integer :: a, b 

    write(*,"(a)", advance="no") "Enter first number: " 
    read(*,*) a 

    write(*,"(a)", advance="no") "Enter second number: " 
    read(*,*) b 

    write(*,*) factorial(a) 
    write(*,*) permutation(a, b) 
    write(*,*) combination(a, b) 

end program testing 

example.f95內容:

module example 


contains 


    integer function factorial(x) 

    implicit none 
    integer, intent(in) :: x 
    integer :: product_ = 1, i 

    if (x < 1) then 

     factorial = -1 

    else if (x == 0 .or. x == 1) then 

     factorial = 1 

    else 

     do i = 2, x 
      product_ = product_ * i 
     end do 

     factorial = product_ 

    end if 

    end function factorial 


    real function permutation(x, y) 

    implicit none 
    integer, intent(in) :: x, y 
    permutation = factorial(x)/factorial(x - y) 

    end function permutation 


    real function combination(x, y) 

    implicit none 
    integer, intent(in) :: x, y 

    combination = permutation(x, y)/factorial(y) 

    end function combination 


end module example 

當我運行此代碼,輸出爲:

Enter first number: 5 
Enter second number: 3 
    120 
    0.00000000  
    0.00000000  

的排列組合功能不起作用正常。感謝您的回答。

+1

這讓很多C/C++程序員感到驚訝。 'integer:i = 42'不等於'integer :: i;我= 42',而是'integer,保存:: i = 42'。 「i」的值在呼叫之間保持不變,並且不會重置爲42。 – jlokimlin

回答

2

我認爲你已經犯了Fortran衆所周知的(對於那些知道它的)陷阱的犯規。但在揭示之前,我必須問你做了多少測試?我跑你的代碼,得到了奇結果,並想了一會兒......

然後我測試了factorial功能的x它生產

factorial   1 =   1 
factorial   2 =   2 
factorial   3 =   12 
factorial   4 =   288 
factorial   5 =  34560 
factorial   6 =  24883200 
factorial   7 = 857276416 
factorial   8 = -511705088 
factorial   9 = 1073741824 
factorial   10 =   0 

這顯然是錯誤的幾個小的值。因此,在尋求幫助之前,您似乎沒有正確測試您的代碼,如果有的話。 (我沒有測試你的combinationpermutation功能。)

ØTEMPORA,鄰習俗

你初始化該行

integer :: product_ = 1, i 

變量product_這自動意味着, product_獲取屬性save,以便將其值從調用存儲到調用(gotcha!)。每次通話開始時(除第一次通話以外)product_具有上次通話結束時的價值。

補救辦法很簡單,不要初始化product_。更改

integer :: product_ = 1, i 

integer :: product_ , i 
... 
product_ = 1 

簡單還是將自己寫的階乘的功能,但使用的內在product功能但這是另一個故事。