1

再帰サブルーチンで生成されるファイルに結果を書き込みたいと思いました。また、ファイル内のデータ(読み取り)をfortran90のメインプログラムの配列に割り当てたいと思いました。

program permutations
  implicit none

  call generate (position_min)

  open(unit=20, file="a.dat", status="old")
  do i=1,720
     read(20,*)(G(i,j),j=1,6)
  end do
contains
 recursive subroutine generate (position)
   implicit none
   integer, intent (in) :: position
   integer :: value

   if (position > position_max) then
     open(unit=20, file="a.dat", status="unknown")
     write (20, *) permutation
   else
     call generate(position+1)
   end if

 end subroutine generate
end program permutations

このプログラムでは、次のランタイム エラーが発生します。

At line 19 of file p2.f90 (unit = 20, file = 'a.dat')
Fortran runtime error: End of file

これを修正するにはどうすればよいですか?

4

1 に答える 1

0

答えは主に質問に対する私のコメントだと思います。コード (宣言されていない変数の問題を無視して)、特にif再帰サブルーチンの - ステートメントを見ると、次のようになっていることに注意してください。

if (position > position_max) then
  open(unit=20, file="a.dat", status="unknown")
  write (20, *) permutation
else
  call generate(position+1)
end if

つまり、次の場合にのみファイルに書き込みます。この条件を満たすと、 1行が書き込まれ、前のすべてのステートメントが完了します。おそらくあなたが意図していたのは、再帰ループを介して毎回ファイルに書き込むことでした。そのためには、次のようなものが必要です position > position_maxa.datif

open(20,file="a.dat",status="unknown")
write(20,*) permutation
close(20)
if(position > position_max) then
   return
else
   call generate(position+1)
endif

position=position_minこれを実行すると、( atと atを書いているため) 2 行余分に取得していることがわかりましたposition=position_maxreadおそらくそれを微調整して正確に720にすることもできますが、ループを次のように変更できるため、この部分は無関係だと思います

i=1
do
   read(20,*,iostat=ierr) G(i,:)
   if(ierr/=0) exit
   i = i+1
enddo

通常の読み取りiostatでは 0 が返され、ファイルの終わりでは -1 が返されるため、読み取りができる限りループを続行し、EOF が見つかったときに中断します。

宣言されていない変数を修正し、close(20)ステートメントを追加し、上でコメントしたように調整した後、再帰サブルーチンでの書き込みと読み取りに問題はありませんでした。

于 2013-08-21T01:19:52.820 に答える