私はFortranを初めて使い、以下が可能かどうかを理解しようとしています。プログラムを構成する私のアイデアは、精度と変数の型を1つのモジュールで宣言することです。次に、他のモジュールやメインプログラムの型を再度宣言することなく、それらの変数を使用します。精度とグローバル変数型のためのFortranリンクモジュール
gfortran -c mod_pre.f90
gfortran -c mod_hon.f90
:
module hon
use pre
implicit none
contains
function KE(H,M) result(KR)
KR = 2*PI/H/M
end function KE
end module hon
は、その後、私はこの順序でのgfortranを使用します。
module pre
implicit none
INTEGER, PARAMETER :: sp=SELECTED_REAL_KIND(6,37)
INTEGER, PARAMETER :: dp=SELECTED_REAL_KIND(15,307)
INTEGER, PARAMETER :: qp=SELECTED_REAL_KIND(33,4931)
REAL(dp), PARAMETER :: pi = 4.*ATAN(1.)
REAL(dp) :: H
REAL(dp) :: M
REAL(dp) :: KR
end module pre
は、今私は、次のような1つまたは複数の機能を、含まれている別のモジュール内のすべての変数を利用したいです
'module pre'は 'module hon'の一部なので、順番にコンパイルしますが、gfortranはエラーを表示します。
上記のコードでは、変数の型とパラメータはUSEに含まれているはずです。しかし、私がgfortranから得たメッセージは、私が 'module hon'をコンパイルしようとすると、私の変数にIMPLICIT型がないことです。
誰かが問題を明確にしたり解決策を提案したりできますか?変数を複数のモジュールに分散させないようにしたいと思います。
ありがとうございます!
こんにちはfrancescalus、私にご負担ください。次に、変数型を宣言し、そのモジュールを他の型に使用することはありませんか?たとえば、結果 'kr'は常に実数(dp)と残りの入力変数になります。これは、一度定義するのではなく、すべてのモジュールで 'H'や他のモジュールを宣言する必要があることを意味します。 – musi
あなたの例では、sp、dpおよびqpは次のように使用できます。関数の種類を定義する 'real(kind = dp):: ke'です。 @francescalusが指摘する*変数* 'kr'は、ローカルとして再定義されています。モジュールスコープの 'kr'は、ローカル' kr'が定義されていない場合に使用されます。 –
こんにちは、あなたの答えをありがとう、私は解決策を回避したと私が見つけた唯一の方法は、関数内の変数を再定義することです。私は現在、変数についてREAL(4)をREAL(8)に渡しているgfortran州の関数に関する別の問題に直面しています。私はそれを少し始めるのは難しいと思っています。この問題を克服する方法はありますか? – musi