0

次の Fortran コードがあります。説明してください..

OPEN(UNIT=4,STATUS='SCRATCH',ACCESS='DIRECT',RECL=2048,IOSTAT=IOCHK)

ここで、IOCHK は 0 に初期化されていません。ガベージ値が与えられているため、コードが機能しません。

IF(IOCHK.NE.0)THEN
// failed code

個別に初期化できますか?

4

3 に答える 3

3

kgiannakakis は正しいですIOCHK。整数として宣言する必要があります。

ただし、他にもいくつか指摘しておきたいことがあります。

  1. OPENステートメントの後、IOCHKI/O 操作のステータスが保持されます。IOCHK単に破棄されるため、事前にの値を設定する必要はありません。
  2. コードで使用する必要がIMPLICIT NONEあります。これにより、このような宣言されていない変数にコンパイル時のエラーとしてフラグが付けられ、このような問題を簡単に見つけることができます。
  3. これとあなたの他の質問を読んだ後、あなたはこのコードを書いていますか、それとも単にそれを維持していますか? あなたがそれを書いているのなら、おそらく私よりも古いスタイル/言語バージョンで書いているべきではありません.
于 2009-07-21T15:47:00.590 に答える
1

IOCHK は、コード内で宣言も初期化もされていません。OPEN ステートメントの前に、次のようなものが必要です。

INTEGER IOCHK
IOCHK = 0

上記は、整数変数を宣言し、それに値を割り当てます。

于 2009-07-21T07:30:36.690 に答える
0

わざわざ変数を宣言したくない場合は、サブルーチンの先頭で次の行を使用できます。

implicit integer (i-n)

これにより、範囲 (in) 内の文字で始まるすべての変数が整数として宣言されます。

useもちろん、対象のサブルーチンの先頭で変数を個別に宣言することも、ステートメントを介してコードの他の部分から見えるようにするために変数をモジュールに入れることもできます。

   INTEGER :: IOCHK

IOCHK がまだ初期化されていないため、 file ステートメントの後でのみのステータスIOCHKがチェックされるようにする必要があります。OPENデフォルトで変数が初期化される値は、コンパイラに依存します。例えば

  program main
  write(*,'(A8,I5)')  'M = ' ,M
  stop
  end program

M = 0との両方ifortで印刷されますgfortranが、

  program main
  write(*,'(A8,ES20.5)')  'M = ' ,M
  stop
  end program

で失敗しgfortranます。

IOCHK一般に、が明示的に宣言されていなくても問題はないと思います。例として、次のコードを考えてみましょう

  PROGRAM MAIN
  OPEN(UNIT=4,STATUS='SCRATCH',ACCESS='DIRECT',RECL=2048,IOSTAT=IOCHK)
  IF(IOCHK==0) write(*,'(A8,I5)')  'IOCHK = ' ,IOCHK
  STOP
  END PROGRAM

ifort両方でコンパイルすると、gfortranこれIOCHK = 0が画面に表示されます。これは、スクラッチ ファイルが正常に開かれたことを意味します。

お役に立てれば

乾杯

于 2015-06-23T09:03:46.570 に答える