2017-04-30 10 views
0

こんにちは私が得ている1つのエラーメッセージを強調するために、以下の最小、完全で検証可能なサンプルサンプルコードを作成しようとしました。エラーは "(1)で引数 'func0'に型の不一致があり、COMPLEX(4)に渡されたREAL(4)が返されます。サブルーチン内でサブルーチンを呼び出すときにエラーが発生する

エラーメッセージが(1)別のサブルーチン内のサブルーチンを呼び出すようにしてみてください。

私はもともとSUB2に暗黙のどれを追加しないようにしようとした、しかし、私はfunc0、func1のが暗黙の型を持っていないというエラーメッセージが表示されます。

私はロジックに従ってみましたこの投稿のHow to call and use a subroutine inside another subroutine in fortran?

Module Sample 

integer :: n,m 

contains 

subroutine Sub1(func0,func1) 

implicit none 

    complex, dimension(-10:10, -10:10), intent(inout) :: func0,func1 
    complex, dimension(-10:10, -10:10) :: Deriv0,Deriv1 


    do while (100 > 0.000001) 

     Deriv0 = Deriv(func0) 
     Deriv1 = Deriv(func1) 

    end do 

end subroutine Sub1 

subroutine Sub2(func3) 
!implicit none : if this line is not commented out, I still get error messages saying func0,func1 do not have implicit types 

    real,dimension(0:20), intent(inout) :: Func3 

    call Sub1(func0,func1) !error message from here, this is line (1) 

end subroutine Sub2 

function Deriv(func) 
implicit none 

complex, dimension(-10:10, -10:10) :: func, Deriv 

    do n=-9,9 
    do m=-9,9 

    Deriv(n,m) = func(n+1,m)-2*func(n,m) 

    end do 
    end do 

end function Deriv 

End Module Sample 

このエラーを修正するにはどうすればよいですか?ありがとう。

答えて

2

私たちはここにいくつかの概念があります。協会;および相続。

疑問のコードでは、モジュールsampleと、3つの手順(2つのサブルーチンと1つの関数)の4つのスコープ単位があります。これらはすべて異なっていますが、いくつかの情報はそれらの間で共有されています。

最初にimplicitを参照してください。モジュールにはimplicitがないので、モジュールの有効範囲単位にデフォルトの入力規則が適用されます。 (暗黙的に型付けされているモジュールはありませんが、モジュール変数と関数はすべて明示的に宣言されています)sub1derivにはそれぞれimplicit noneがあるため、タイピング規則(暗黙の型指定なし)が明示されています。 sub2で指定implicit none

func0func1の明示的な型宣言についてコンパイラの苦情があります。 implicit noneを指定しないと、スコープユニットsub2はそのホスト(モジュール)のタイピングルールを継承しますので、func0func1は実際のものです。

で有効範囲の単位と入力規則について読むことができます。要約すると、implicit noneをモジュールに入れます。

func0func1の入力は、スコープの別の側面につながります。 sub1sub2は全く異なるスコープ単位です。これらの2つのサブルーチンが宣言に関する知識を共有できる唯一の方法は、1つの形式の関連付けによるものです。

ここでは、ホストアソシエーションと引数アソシエーションの2つの形式があります。

ホストアソシエーションは、各サブルーチンが変数nmにアクセスできることです。彼らはそれらの変数を参照しないので、それらを無視しましょう。ホストアソシエーションは、sub2に明示的なインタフェースsub1を与えます。これにより、コンパイラは型の不一致について文句を言うことができます。

sub2のスコープ単位では、func0func1という明示的な宣言はありません。これはimplicit noneのエラーです。デフォルトの暗黙の型定義規則では、実スカラー変数または実スカラー結果を持つ関数です。それらを複雑な配列にしたい場合は、それらを宣言する必要があります。

引数の関連付けは次のようになります。 sub1の仮引数を実際の引数sub2に関連付けます。ここで重要なことはアソシエーションです。同じオブジェクトを参照するために2つの異なることが起こります。 2つの手順は、それぞれに明示的に記載されていないものは共有しません。これらの仮引数に実際の引数を関連付けるには、適切なものがsub2のスコープ内に存在する必要があります。現在は何もありません。要するに


:あなたはsub2func0func1適切な宣言を持っている必要があります。プログラムをどのように流したいかによって、ローカル変数や仮引数があります。

+0

これは私にとって非常に役に立ちます。私はあなたが示唆したように、sub2でfunc0、func1を宣言することによってエラーを修正することができました。私は暗黙のnoneもモジュールに追加しました。その他の説明もありがとうございました。私はあなたに知らせることができますが、私は今のように何も質問がない場合、これはすべて非常に明確です。ありがとう! –

0

(免責事項:私は実際にFortranのを知らないこの答えはWAGある)

あなたSub2サブルーチンで、func0func1どちらが宣言されている、と彼らはパラメータはありません。コードの他の部分とは異なり、にはimplicit noneというディレクティブが含まれていないため、func0REALという変数になります(Sub1には変数COMPLEXが必要です)。

あなたのコードはどこにでもSub2を呼び出すことはありませんが、おそらくあなたはSub1に渡すどこかから2つのCOMPLEXの変数を取得する必要がありますので、私はこの問題を解決する方法を伝えることはできません。

+0

私は暗黙のnoneがないことを認識しました。追加したときに、暗黙の型を持たないfunc0、func1についてのその他のエラーメッセージが表示されました。だから最初にこの1つのエラーメッセージから始めたいと思った。 Func0、Func1は定義しないでください。私のSub2では、func0、func1が定義されているSub1を呼び出す理由が正確にthatsです。 'contains'という部分は私のモジュール内のすべてのサブルーチンと関数を呼び出すと思いますが、私は明示的に各関数/サブルーチンを呼び出すわけではありません。 sub2にはsub1が必要なので、私はここでこの呼び出しを使用しました。 あなたの答えをありがとう、あなたは正しいかもしれません。しかし、私はそれを修正する方法を知らない –

+0

例:私のコードはsub1または関数Derivを呼び出すことはありませんが、そこからエラーは出ません。私のモジュールにはこれを扱う 'contains'があります(私は思います)。Sub2を追加すると、Sub1を呼び出そうとするとエラーになります。明らかに何かがこのロジックに間違っています、あなたはSub2に電話することをどのように提案しますか?私はSub1またはFunction Derivを呼び出すことはないので、なぜSub2を呼び出さなければならないのですか? –

+0

@Integrals 'Sub2'を呼び出す必要はありません。それはあなたがそれをどのように使用するのかという手がかりを私に与えているかもしれません。今、私はこのコードが達成すべきものは何もわからないので、代わりに何をするべきか教えてもらえません。 – melpomene

関連する問題