1

作業中の Fortran プログラムで、入力ファイルの処理中にランタイム エラーが発生しました。

At line 182 of file ../SOURCE_FILE.f90 (unit = 1, file = 'INPUT_FILE.1')
Fortran runtime error: Bad value during integer read

行 182 を見ると、暗黙的/暗黙的な DO ループを含む READ ステートメントが表示されます。

182:    READ(IT4, 310 )((IPPRM2(IP,I),IP=1,NP),I=1,16)    ! read 6 integers
183:    READ(IT4, 320 )((PPARM2(IP,I),IP=1,NP),I=1,14)    ! read 5 reals

フォーマット ステートメント:

310 FORMAT(1X,6I12)

デバッガーでこのコードに到達するとNP、値が 2Iになり、値が 6 になり、値が 67 になります。ループで再初期化する必要があるとIP思います。IIP

私の問題は、デバッガーでステップスルーしようとすると、READ ステートメントが実行されたように見えて、エラーがスローされることです。読んでいるときにそれに従う方法がわかりません。関数に足を踏み入れてみましたが、gfortran ライブラリに慣れていないため、難しいルートのようです。入力ファイルは問題ないようです。問題なく読み取られるはずです。これは、この READ ステートメントが意図したとおりにループしていないと思わせます。

私は Fortran とこのような暗黙的な DO ループに完全に慣れていませんが、182 行目は書式文字列 #310 に従って 6 つの整数で読み取られるはずです。ただし、到着したときNPの値は2であるため、2つの整数を16回しか読み取ろうとしないと思います。

IPPARMこの読み取りステートメントをデバッグして、ファイルから読み取られたときに読み取られた値を調べるにはどうすればよいですか? Fortran ライブラリをステップ実行する必要がありますか?

これらの暗黙のループに関する私の混乱を解消できるヒントをいただければ幸いです。

ありがとう!

注: Linux で gfortran/gcc と gdb を使用しています。

4

2 に答える 2

1

変数 IP と I はループ インデックスであるため、ループによって再初期化されます。NP=2 の場合、最初のステートメントは合計 32 個の整数を読み取ります。これは、読み取る項目のリストの決定に貢献しています。フォーマットは、それらがどのように読み取られるかを決定します。これらは、入力ファイルの行ごとに"1X,6I12"6 つの整数として読み取られます。要求された 32 個の整数のうち最初の 6 個が行/レコードから読み取られると、Fortran はその行/レコードが完了したと見なし、次のレコードに進みます。

整数の形式で"1X,6I12"は、ファイル内で正確に配置する必要があります。空白が 1 つある必要があり、整数はそれぞれ 12 列のフィールドで右寄せにする必要があります。それらがずれると、間違った値が読み取られたり、実行時エラーが発生したりする可能性があります。

于 2012-07-17T14:47:51.093 に答える
1

読み取り時に特定の書式設定が必要な理由はありますか? 可能な場合は READ(IT4, *) を使用します...

gfortran の以降のバージョンでは、無制限の形式の読み取りがサポートされています (リンクhttp://fortranwiki.org/fortran/show/Fortran+2008+statusを参照) 。

次に、指定すると役立つ場合があります

310 FORMAT("*(1X,6I12)")

または古いコンパイラの場合

310 FORMAT(1000(1X,6I12))
于 2012-07-17T20:06:27.070 に答える