2016-05-02 47 views
0

期待されている場合、私は複雑な配列が

subroutine foo(cnumbers, n) 
    integer :: n 
    complex :: cnumbers(n) 
    ... 
end subroutine foo 

のような複雑な配列を必要とFortranのサブルーチンを持っていると、後で私が

real :: rnumbers(40) 
... 
call foo(rnumbers, 20) 

ようにそれを呼び出すようにしたいしかし、私が手に本当の配列を渡しますコンパイラエラー:

error #6633: The type of the actual argument differs from the type of the dummy argument.

もちろん、実際の配列は複雑な配列ではないので、これは理解できます。しかし、それを機能させる方法が必要です。サブルーチンfoofooの呼び出しが異なるモジュールであり、異なるFortranのファイルにダウン書かれている場合、コンパイラがないため

ないは文句を言うと、すべてが正常に動作します。

誰かがそれを動作させる方法を知っていますか?複雑な配列が予想される場合、実際の配列を渡すには?あなたは同値が動作しません割付け配列が必要な場合は

+0

呼び出し側でさらにコードを表示する必要があります。 'rnumbers'が仮引数でない場合は、複素数配列で等価にすることができます。 –

+0

いいえ、 'rnumbers'はダミーではなく、' real :: rnumbers(40) 'で作成した実際の変数です。ところで、私はインテルFortranコンパイラ15.0.3を使用しています。 – thyme

+0

サブルーチンが外部(明示的なインタフェースなし)の場合、コンパイラは型の問題を検出せず、正常に動作します。 – agentp

答えて

2

あなたはタイプを変換するtransfer(rnumbers, ...)を使用するか、またはそれ

real :: rnumbers(40) 
    complex :: cnumbers(20) 
    equivalence (rnumbers, cnumbers) 

    set the value of rnumbers 

    call foo(cnumbers, 20) 

を避けるために、同値を使用します(一時的な配列が作成される可能性が高いです)。

また、外部サブルーチンを使用し、インターフェイスについてコンパイラを置いて、複雑なものの代わりに実際の配列を渡すこともできます。標準準拠ではありませんが、時には使用されます。参照先Gfortran complex actual to real dummy argument

+0

ありがとうございました。しかし、残念ながら私は割り当て可能な配列を扱います。ポインタなどの回避策はありませんか?非常に大きな配列の場合、 'transfer'を使った解決策は高価です。 – thyme

+0

@thyme **これが、私があなたにもっと多くの呼び出しコードを追加することを要請した理由です!**なぜあなたは単純にそれを行うことができませんか?あなたが投稿したコードが不完全であり、免責条項が追加されたと仮定しています...あなたがした唯一のことは、 "rnumbersはダミーではなく、実際の変数:rnumbers(40)まったく真実でなくても... –

+0

申し訳ありませんが、私はあまりにも素朴でした。私はできるだけシンプルな例を作ると思った... – thyme

関連する問題