2017-05-06 20 views
0

將函數作爲參數正確傳遞給子例程時出現問題。函數`f`在作爲參數傳遞給Fortran子例程時沒有隱式類型

我最初在一個.f90文件中編寫程序,但我不得不切換到CodeBlocks,因此需要將我的模塊拆分爲單獨的文件。我遇到了一個我認爲在分割之前不存在的錯誤:

程序使用名爲「diff_eq.f90」的模塊,該模塊又調用名爲「find_root」的子例程。該子程序位於名爲「roots.f90」的不同模塊中。

模塊 「diff_eq」 呼籲通過 「find_roots」:

module diff_eq 
contains 
    function solve_star([bunch of arguments]) result(r) 
    use roots 
    real(8) :: r,[bunch of arguments] 
    call find_root(f,df,[bunch of arguments]) 
    end function solve_star 
end module diff_eq 

的參數 「F,DF」 是在另一個模塊名爲 「wdstar.f90」 中定義的功能。例如,對於 「F」 的宣言是

function f(r) 
    real(8),intent(in) :: r(:) 
    real(8) :: f(size(r)) 
    integer :: i,n 
    real(8) :: dns(size(r)),prs(size(r)) 

    [bunch of calculations f(n) = ...] 

end function f 

和程序本身包含的所有聲明:

use diff_eq 
use roots 
use wdstar 

最後, 「find_root」 通過聲明這些功能:

subroutine find_root(f,df,r,[arguments]) 
    real(8),intent(in out) :: r(n) 
    real(8) :: [more arguments] 
    interface 
     function f(r) 
     real(8),intent(in) :: r(:) 
     real(8) :: f(size(r)) 
     end function f 
     function df(r) 
     real(8),intent(in) :: r(:) 
     real(8) :: df(size(r),size(r)) 
     end function df 
    end interface 

    [bunch o' calcs] 

    end subroutine find_root 

我問題是:將這些函數傳遞給「find_root」的正確方法是什麼?

目前,我得到一個錯誤:Symbol "f" has no IMPLICIT type

+1

爲什麼顯然?如果很明顯,你爲什麼要問這裏?什麼是**完整**輸出?編譯器是否報告錯誤發生的代碼行? –

+0

@VladimirF對於單詞的選擇我表示歉意。在詢問這裏之前,我做了一些閱讀,並且我承認這些東西需要明確定義一種類型,否則有時會收到一些默認類型。所以我明白爲什麼應該爲函數分配一些類型,但我不明白它應該是什麼。 – Yoni

+0

你的意思是錯誤的完整輸出?編譯器會報告「solve_star」函數中的「調用find_root(f,df,[一堆參數])」行上的錯誤 – Yoni

回答

1

我不能看到diff_eqf任何聲明。 (如果有的話,請顯示它。)

如果f它是外部的,則聲明爲這樣。或者在模塊中使用f所在的相應模塊。

你可能只是缺少use wdstar,但你只顯示代碼的一小部分,所以我不確定。

相關問題