2

2*2 行列の固有値を計算する関数を作成しました。引数として 2*2 行列を取り、2 要素配列を介して 2 つの固有値を返します。次のように、プログラム単位で関数を宣言しました。

real, dimension(2), external :: eigenvalues

しかし、コンパイルされず、次のエラーが発生します。

Error: EXTERNAL attribute conflicts with DIMENSION attribute

配列を返す関数を持つことは不可能ですか、それとも何か間違っていますか?

ヘルプ/提案をいただければ幸いです。それが役立つ場合は、gfortranコンパイラでfortran 90を使用しています

4

2 に答える 2

1

Intel Fortranコンパイラのドキュメントには、EXTERNALはDIMENSIONと互換性がないことが記載されています。これは、おおよそコンパイラが示していることです。私はFortran2003の標準をざっと見てきましたが、この点で明確に解釈できませんでした。そのため、Intelに同意し、あなたがやろうとしていることは非標準であると断言します。

あなたは確かに配列を返す関数を書くことができます。

関数EIGENVALUESを記述し、それをEXTERNALとして宣言しようとしているのは、私には少し奇妙に見えます。私は通常、関数定義を、より大きなプログラムユニット内のCONTAINSセクション、または呼び出し側ユニットが使用するMODULEのいずれかに配置します。どちらの場合も、外部のものを宣言する必要はありません。

固有値のソースは、呼び出し側プログラムのソースとどこにありますか?

于 2010-09-17T16:17:42.733 に答える
1

他の2つの答えを適度に拡張すると、他のアプローチは通常、古い「外部」よりも好ましいと思います。(「Fortran 2003 ハンドブック」には、「外部」を使用しなければならないケースが少なくとも 1 つリストされています。) 既に示唆されているように、独自のソース コードの場合は、プロシージャ (関数とサブルーチン) をモジュールの contains セクションに配置してから、それ。これにより、コンパイラーが呼び出し内の引数とプロシージャーの仮引数との間の互換性をチェックできるように、プロシージャーのインターフェースが自動的に明示的になります。これにより、多くのプログラマーの間違いを見つけることができます。ライブラリにリンクしている場合や C を呼び出している場合など、何らかの理由で Fortran ソース コードにアクセスできない場合は、手順を説明するインターフェイス ステートメントを記述します。これにより、宣言された名前が関数またはプログラムであることをコンパイラに通知し、引数チェックを許可するインターフェイスを指定します。これは、2 つの項目を変更する必要があるため、モジュール メソッドを使用できない場合にのみ行います。

おそらく、これが機能しない理由は、「Fortran 2003 ハンドブック」によると、外部属性の使用は明示的なインターフェイスを提供せず、配列引数を返す関数には明示的なインターフェイスが必要であるためです。この場合、インターフェイスが非明示的であると見なされる理由がわかりません。

于 2010-09-17T17:03:42.083 に答える