4

私は科学モデリングプログラムに取り組んでいますが、まだプログラムをコンパイルすることさえできていません。私の教授が以前に動作したと主張するコードには触れていません。メイクファイルだけです。多くの試みの後、私が得た最も遠いものはこのエラーでした:

Error on line 1112: Declaration error for xxmf: adjustable dimension on non-argument
   upcase:
   intrpl:
   splin:
   mtrnpr:

私の教授は、これは単なるコンパイルの問題であり、これを修正するために使用できるグローバル変数を含むオプションが必要であると主張しています。私が見つけた最も近いのは、オプションを使用することです

 -Mipa=safeall

しかし、正しい場所に置いているのか、それとも同じエラーが発生するため、違いが生じたのかはわかりません。

4

1 に答える 1

12

おっと -- あなたのスーパーバイザーの特定のバージョンの古代の f77 コンパイラーで問題なく動作する古いコードがあるように聞こえますが、標準に準拠したコンパイラーが正しいことをします。

調整可能な配列は次のようなものです。

subroutine mysub(a,n)
integer n
real a(n)

-- つまり、多かれ少なかれ C で行うのと同じ方法で配列を渡します。Fortran90 以降では、形状引き継ぎ配列を使用できます。

subroutine mysub90(a)
real a(:)
n=size(x,1)

これは、コンパイラーが配列の正しいサイズが渡されることを保証するため、非常にクリーンです。

したがって、スーパーバイザーのコードは、おそらく実行時に特定のサイズの配列を作成する方法として、サブルーチンの引数ではないものでこの種の構造を使用しているようです。標準の Fortran77 ではこれが許可されていませんでしたが、いくつかのコンパイラは拡張機能として許可していました。幸いなことに、これを行うための標準的な方法として割付け配列を使用できるようになったので、変数を割付け配列に変更することをお勧めします。

ちなみに、このような問題を事前に発見して追跡できる静的コード分析ツールはたくさんあります。 理解は、多くの問題を見つけることができる〜2週間の評価ライセンスを備えた優れた商用のものです. forcheckは、それほどユーザーフレンドリーではありませんが、非常に完全です。このようなツールを使用して、スーパーバイザーのコードを 2010 年代に引きずり出すのは少し面倒ですが、時間の優れた投資になります。もう 1 つの優れたツール セットは eclipse + photranですが、残念ながら、これは fortran90 の優れたコードがあることを前提としています。これを使用できるようになるまでには、しばらく時間がかかります。

(そして、誰かが fortran について卑劣なコメントをし始める前に -- はい、はい、そこには古いくだらない fortran コードがたくさんありますが、それは今ではほとんど fortran に固有のものではありません.)

于 2011-02-21T21:51:10.843 に答える