0

Fortran プログラムでは、配列を特定の形式でファイルに書き込む必要があります。小さい配列 (たとえば、以下の例では alen=10) では完全に機能しますが、より大きな配列では機能しません。1 行あたりの最大文字数を超えたかのように、各行を 2 つに分割します。

例(私のプログラムの構造に非常に似ています):

PROGRAM output_probl
IMPLICIT NONE

INTEGER, PARAMETER :: alen=110          
DOUBLE PRECISION, DIMENSION(alen)::a
INTEGER :: i,j

OPEN(20,file='output.dat')
30  format(I5,1x,110(e14.6e3,1x))

DO i=1,15
 DO j=1,alen
  a(j)=(i*j**2)*0.0123456789
 ENDDO
 write(20,30)i,(a(j),j=1,alen)
ENDDO

END PROGRAM output_probl

これは正しくコンパイルおよび実行されます (Compaq Visual Fortran を使用)。出力ファイルだけが間違っています。たとえば、配列項目ごとのフィールド幅を 14 から 8 に変更すると、問題なく動作します (もちろん、これは満足のいく解決策ではありません)。不適切なデフォルトの最大レコード長について考えましたが、それを変更する方法が見つかりません (動作しないように見える RECL を使用しても - 動作すると思われる場合は、RECL を使用した具体的な例を歓迎します)。

これは基本的なことかもしれませんが、私はしばらくそれで立ち往生しています...どんな助けも大歓迎です、どうもありがとう!

4

2 に答える 2

3

アクセスをストリーミングしないのはなぜですか? シーケンシャルでは、常にプロセッサに依存するレコード長の制限があります。

PROGRAM output_probl
IMPLICIT NONE

INTEGER, PARAMETER :: alen=110          
DOUBLE PRECISION, DIMENSION(alen)::a
INTEGER :: i,j

OPEN(20,file='output.dat',access='stream', form='formatted',status='replace')
30  format(I5,1x,110(e14.6e3,1x))

DO i=1,15
 DO j=1,alen
  a(j)=(i*j**2)*0.0123456789
 ENDDO
 write(20,30)i,(a(j),j=1,alen)
ENDDO

END PROGRAM output_probl

FORMAT注意として、書式文字列に文字変数を使用するか、ラベル付きのステートメントの代わりに書き込みステートメントに直接配置します。

Fortran 95 バージョン:

PROGRAM output_probl
IMPLICIT NONE

INTEGER, PARAMETER :: alen=110          
DOUBLE PRECISION, DIMENSION(alen)::a
INTEGER :: i,j,rl
character(2000) :: ch

inquire(iolength=rl) ch

OPEN(20,file='output.dat',access='direct', form='unformatted',status='replace',recl=rl)
30  format(I5,1x,110(e14.6e3,1x))

DO i=1,15
 DO j=1,alen
  a(j)=(i*j**2)*0.0123456789
 ENDDO
 write(ch,30)i,(a(j),j=1,alen)
 ch(2000:2000) = achar(10)
 write(20,rec=i) ch
ENDDO

END PROGRAM output_probl
于 2013-02-07T12:40:00.483 に答える
0

以下のプログラムをテストする必要があります。Absoft コンパイラを使用すると、n=10000、10 文字の単語、つまり 1 行で 100000 文字幅 (プラス 2 文字) で問題なく動作します。G95 では、n=5000 (n=4000 で動作) の場合、「このコマンドを処理するのに十分なストレージがありません」というメッセージが表示されます。character*10,dimension(:),allocatable:: テスト整数,dimension(:),allocatable::itest

1 write( , )'Enter n > 0' read , n if(n.le.0) then write( , )'requires value n > 0' go to 1 endif write( ,*)'n=',n allocate (テスト(n)、テスト(n))

  write(test,'((i10))')(i,i=1,n)
  write(*,*)test

  open(10,file='test.txt')
  write(10,*)test
  write(*,*)'file test.txt written'
  close(10)

  open(11,file='test.txt')
  read(11,*)itest 
  write(*,*)itest
  end
于 2014-07-11T15:17:09.397 に答える