1

タイトルが少しわかりにくいかもしれませんが、私がやりたいこととうまくいかないことの例を挙げましょう。モジュール内にあるサブルーチンを呼び出すメインプログラムがあります。

Program Test_program

Use module_A
Implicit none
Integer :: i
i = 1
call subroutine_A(i)

End program Test_program

この subroutine_A はモジュール A にあり、module_B にある function_B を呼び出します。

module module_A

use module_B
implicit none
contains

subroutine subroutine_A(i)
implicit none
integer, intent(in) :: i
double precision :: j
j = function_B(i)
end subroutine subroutine_A

end module module_A

最後に、module_B は次のようになります。

module module_B
Implicit none
Contains

double precision function function_B(i)
implicit none
integer,intent(in) :: i
function_B = 5.d0*i
end function function_B

end module module_B

プログラムとモジュールは別のファイルにあります。残念ながら、エラー メッセージが表示されるため、これはコンパイルされません。

エラー Subroutine_A: サブルーチン function_B へのこの参照は、CALL ステートメントにありません。

プログラムは function_B がサブルーチンであると認識しているようで、どうすればよいかわかりません。ところで、モジュールを使用してサブルーチンと関数の適切なカプセル化を使用しようとしていますが、これが適切な方法でない場合は、提案を受け付けています (インターフェイスではなくモジュールを使用するように言われたので、これを使用します)。テスト)。

ありがとう

4

1 に答える 1

0

申し訳ありませんが、私は実際に謎を「解決」しました。function_Bという名前を使用する代わりに、Compute_Errorという名前を使用していました。その関数名を別の名前に変更すると、上記の方法が機能しました。私がどこかにリンクしているライブラリの中には、compute_errorサブルーチンがあるようですが、エラーメッセージではどちらのライブラリか、それが確かに問題であるかどうかはわかりませんでした。とにかく、もう一度申し訳ありませんが、モジュールと手順をリンクする方法を確認するのに役立つので、投稿を許可できると思います(インターネット上でその特定の例の例はあまり見つかりませんでした)。もちろん、モジュールと手順を使用するこの方法は適切な方法ではありません。いくつかの有用な知識を自由に追加してください。

于 2013-03-04T05:19:24.797 に答える