3

gfortran を使用して Fortran 90 で純粋なサブルーチンを作成および呼び出す場合、コンパイラがこのエラーを出力する理由を確認するにはどうすればよいですか?

Error: Subroutine call to XXXX at (1) is not PURE

できるだけ具体的に質問すると同時に、他の人にも役立つように十分に一般的であるため、実際のコードに貼り付けることは避け、代わりに何が起こったのかをスケッチします。

Fortran 90 には純粋な手続きに関するさまざまな規則があることを理解しています。基本的には、関数またはサブルーチンのいずれかで副作用を許可しないこと、および で宣言されたサブルーチン パラメータの変更を許可しないことに要約すると思いますintent(in)。最初に純粋であると宣言されておらず、パラメーターが意図を宣言していなかったにもかかわらず、副作用を実行しなかった一連のサブルーチンがあります。inまず、すべてのパラメーター宣言を変更して、 、out、またはのいずれかの意図を明示的に宣言しinoutました。次に、すべてのサブルーチンを と宣言しましたPURE。当然、最初の試行で多くのエラーが発生しましたが、コンパイラーがエラーの内容 (たとえば、このパラメーターを変更しているなど) を教えてくれたintent(in)ので、それらをすべて修正しました。

ただし、これらのプロシージャ間で呼び出しが行われるため、今でも上記の形式のエラーが多数発生します: Subroutine call to XXXX at (1) is not PURE. 私が理解していないのは、呼び出しが純粋ではない理由です。XXXX を純粋にするために考えられることはすべて実行しましたが、コンパイラはまだそうではないと考えています。

だから私の質問 - 言い換えれば - XXXX が純粋ではないと思う理由を gfortran に教えてもらうにはどうすればよいですか?

4

4 に答える 4

3

「私が取り組んでいるライブラリ内のすべての PURE サブルーチンを MODULE に配置しました (これをクライアント コードで使用しました) ......理由はわかりません .....しかし、これを実行した後は、より有用なエラー メッセージが表示されます。が現れ、残りの不純物を追跡することができました。」

サブルーチンをモジュールに配置してから使用すると、インターフェイスが明示的になります。これにより、コンパイラは呼び出しとサブルーチンの間の一致をチェックし、不一致がある場合はエラー メッセージを生成できます。非常に便利なので、サブルーチンと関数をモジュールに配置することをお勧めします。

インターフェイスを明示的にするもう 1 つの方法は、インターフェイスを記述することですが、これは余分な作業であり、間違いを犯すための余分な手順です。

純粋なサブルーチン/関数に関する要件の長いリストがあります。Metcalf、Reid、および Cohen による Fortran 95/2003 Explained がある場合は、セクション 6.10 を参照してください。たとえば、「保存」変数なし、stop ステートメントなし、外部ファイルへの IO なし、...

他のコンパイラを試して、そのエラー メッセージがより役立つかどうかを確認することもできます。OS によっては、g95 や Sun Studio などの他の無料のものもあります。

于 2009-10-11T16:10:03.327 に答える
1

私は私の答えで私の質問についてより明確にしようとします。これらの理由から、コードを投稿することに消極的でした。

  1. 他の人が私のコードをデバッグしてくれるとは思っていません。それはあまりにも多くのことを求めています。
  2. 質問とその回答をより一般的なものにしたかったのです。
  3. gfortran は私のサブルーチンが PURE ではないと言っているように見えましたが、なぜそれらが純粋ではないと見なされたのかを教えてくれませんでした。

したがって、コードを修正して手順を純粋にする方法ではなく、コードを修正するのに役立つように、gfortran からより有用な情報を引き出す方法を見つけたいと考えていました。

私が行った 2 つのことは、これらの目標を達成するのに役立ちました。もちろん、結果は異なる場合があります。

  1. 次のフラグを gfortran コマンドラインに追加しました: -fmax-errors=100 もちろん、以前に実行したことはありますが、それでも私が知る必要があることを教えてくれませんでした。
  2. 私が取り組んでいるライブラリのすべての PURE サブルーチンを MODULE に配置しました (これをクライアント コードで使用しました)。このライブラリの祖先は Fortran77 と同じなので、本来はそうではありませんでした。理由はわかりませんが (そのため、「結果は異なる場合がある」と強調しています)、これを行った後、より有用なエラー メッセージが表示され、残りの不純物を追跡することができました。

それは漠然とした質問です、私は知っています、そしてそれがどれほど役立つかはわかりません. それでも、読んで、コメントして、回答を追加してくれたすべての人に感謝します。

于 2009-10-02T17:36:34.593 に答える
0

おそらく、PURE としてマークされていないためです。サブルーチンが純粋であるという事実は、サブルーチンがその引数で何をするかしないかに関係するのではなく、それが PURE として宣言されているという事実に関係しています。(もちろん、pure として宣言されると、引数で何をするかが明らかになり、チェックされます。)

于 2009-09-30T17:23:57.757 に答える
0

私は Fortran の初心者で、先週、本の中で Fortran 手続きに関する章に到達しました。私は正しくないかもしれませんが...私の英語を許してくれるなら、いくつかの発言があります:

  1. サブルーチンを純粋に宣言するのは良いスタイルではありません。関数にはお勧めです。
  2. 純粋な手続きは、Fortran 95 標準で導入されました。Fortran 90 にはありません。
  3. この問題は、(Fortran 2003 標準) の項目 C1270 から発生する可能性があります。

組み込み手続きでもステートメント関数でもない手続きが、純粋である必要があるコンテキストで使用される場合、そのインターフェースは、その使用の範囲内で明示的でなければなりません。インターフェイスは、プロシージャが純粋であることを指定する必要があります。

有益な情報となれば幸いです。

于 2009-10-06T09:26:15.613 に答える