2017-09-19 3 views
1

私は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型がないことです。

誰かが問題を明確にしたり解決策を提案したりできますか?変数を複数のモジュールに分散させないようにしたいと思います。

ありがとうございます!

答えて

0

functionステートメントでは、result(kr)は関数の結果が名前krであることを示します。この関数の結果は、モジュール変数krと同じではありません。特に、この関数の結果は、モジュール変数にアクセスできなくなります。

関数の結果は関数自体に固有で、そのプロパティは関数の副プログラム内で宣言する必要があります。

同様に、関数の仮引数はHMで、モジュール変数とは異なり、関数副プログラムで宣言する必要があります。

これ以外にも、おそらくこのother questionと同様の懸念があります。 "krと呼ばれるすべての関数の結果と、HまたはMと呼ばれるすべての仮引数は、これらの特性を持っている"というようには言い表すことはできません。それぞれの個々のオブジェクトにプロパティを指定する必要があります。ファイルが宣言を持っている

function ke(H, M) result (kr) 
    include 'resdummydecls' 
    ... 
end function 

はしかし、私はこれをお勧めしませんが、これはリテラルテキストを含める(ファイルをプリプロセッサを使用するか、または含まは)あなたを助けることができる状況です。

+0

こんにちはfrancescalus、私にご負担ください。次に、変数型を宣言し、そのモジュールを他の型に使用することはありませんか?たとえば、結果 'kr'は常に実数(dp)と残りの入力変数になります。これは、一度定義するのではなく、すべてのモジュールで 'H'や他のモジュールを宣言する必要があることを意味します。 – musi

+0

あなたの例では、sp、dpおよびqpは次のように使用できます。関数の種類を定義する 'real(kind = dp):: ke'です。 @francescalusが指摘する*変数* 'kr'は、ローカルとして再定義されています。モジュールスコープの 'kr'は、ローカル' kr'が定義されていない場合に使用されます。 –

+0

こんにちは、あなたの答えをありがとう、私は解決策を回避したと私が見つけた唯一の方法は、関数内の変数を再定義することです。私は現在、変数についてREAL(4)をREAL(8)に渡しているgfortran州の関数に関する別の問題に直面しています。私はそれを少し始めるのは難しいと思っています。この問題を克服する方法はありますか? – musi

関連する問題