関数を引数としてサブルーチンに正しく渡す問題があります。関数 `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
なぜ明らかですか?それが明らかであれば、なぜここに尋ねるのですか? **完全な出力とは何ですか?エラーが発生したため、コンパイラはコード行を報告しますか? –
@VladimirF言葉の選択についてお詫び申し上げます。私はここで尋ねる前に読んだことがあり、明示的にタイプを定義する必要があるか、そうでなければ何らかのデフォルトタイプを受け取る必要があることを否定します。だから私は、関数に割り当てるべき型があるべきである理由を理解していますが、何をすべきか理解できません。 – Yoni
エラーの完全な出力を意味しますか?コンパイラは、 "solve_star"関数の "find find_root(f、df、[引数の束])"行にエラーを報告します – Yoni