2017-05-06 5 views
0

関数を引数としてサブルーチンに正しく渡す問題があります。関数 `f`はFortranサブルーチンの引数として渡されたとき暗黙の型を持たない

最初は.f90ファイルにプログラムを書きましたが、CodeBlocksに切り替える必要があったため、モジュールを分割してファイルを分割する必要がありました。

このプログラムでは、「find_root」という名前のサブルーチンを呼び出す「diff_eq.f90」というモジュールが使用されています。このサブルーチンは "roots.f90"という名前の別のモジュールにあります。

モジュール "diff_eqは" を介して "find_roots" を呼び出す: "wdstar.f90" という名前のさらに別のモジュールで定義されている機能である "DFと、F" 引数

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" の宣言が

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 

であり、プログラム自体はすべての宣言が含まれています

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 

マイ:

use diff_eq 
use roots 
use wdstar 

は最後に、 "find_rootはは" を介してこれらの関数を宣言します質問は:これらの関数を "find_root"に渡す正しい方法は何ですか?

瞬間に私はエラーを取得する:Symbol "f" has no IMPLICIT type

+1

なぜ明らかですか?それが明らかであれば、なぜここに尋ねるのですか? **完全な出力とは何ですか?エラーが発生したため、コンパイラはコード行を報告しますか? –

+0

@VladimirF言葉の選択についてお詫び申し上げます。私はここで尋ねる前に読んだことがあり、明示的にタイプを定義する必要があるか、そうでなければ何らかのデフォルトタイプを受け取る必要があることを否定します。だから私は、関数に割り当てるべき型があるべきである理由を理解していますが、何をすべきか理解できません。 – Yoni

+0

エラーの完全な出力を意味しますか?コンパイラは、 "solve_star"関数の "find find_root(f、df、[引数の束])"行にエラーを報告します – Yoni

答えて

1

私はdiff_eqfのいずれかの宣言を見ることができません。 (ある場合は表示してください)

f外部の場合は、それを宣言してください。または、fがモジュール内にある場合は、適切なモジュールを使用します。

あなたはおそらくちょうどuse wdstarが不足しているかもしれませんが、私は分かりませんのでコードの小さな部分だけを表示します。

関連する問題