0

さて、私はこのようなファイルを持っています:

2 3
6 6 22
-1 3 0

最初の行の整数は行列の次元です(行列には含まれません)。次元の下の行は実際の行列です。この行列を2D配列に格納するプログラムを作成しようとしていますが、次のようになります。ネストされたdoループを使用してマトリックスを読み込もうとすると、ランタイムエラーが発生します。「Fortranランタイムエラー:ファイルの終わり」と言い続けますここに私のコードがあります

PROGRAM addsub
IMPLICIT NONE

CHARACTER(30)::file1
INTEGER:: i,j,err1
INTEGER, DIMENSION(1)::dim1r,dim1c
REAL, ALLOCATABLE:: array1(:,:)


WRITE(*,101) "What is the first filename?"
READ(*,*) file1

OPEN (UNIT=11, FILE=file1, STATUS="OLD", ACTION="READ", IOSTAT=err1)
IF (err1 .NE. 0) THEN
    WRITE(*,'(2A)')"There was an error opening ", file1
    STOP
END IF

DO i=1,1,1
    READ(11,*)dim1r(1),dim1c(1)
END DO

ALLOCATE(array1(dim1r(1),dim1c(1)))

REWIND(11)
DO i=1,dim1r(1),1
    DO j=1,dim1c(1),1
        READ(11,*) array1(i,j)
    END DO
END DO

END PROGRAM addsub
4

1 に答える 1

1

主な問題は、各READステートメントが別々の行を読み取ろうとしていることです。6 行を読み込もうとしているのに、ファイルにはそれほど多くはありません。

これにはいくつかの方法があります。

を使用して一度に各番号を 1 つずつ読み取ろうとすることはadvance='no'できますが、これは、リスト指示入力を使用できず、明示的に書式設定を使用する必要があることを意味します。

DO i=1,dim1r
    DO j=1,dim1c-1
        READ(11,FMT='(F2.0)',advance='no') array1(i,j)
        PRINT *, array1(i,j)
    END DO
    READ(11,FMT='(F2.0)') array1(i,dim1c)
END DO

暗黙の do ループを使用して、行全体を一度に読み取ることができます。

DO i=1,dim1r
    READ(11,*) (array1(i,j),j=1,dim1c)
END DO

または、配列スライスを指定して対処するだけです。

DO i=1,dim1r
    READ(11,*) array1(i,1:dim1c)
END DO

もう 2 つの点に注意してください。配列である必要はdim1cありdim1rません。ヘッダーを読み取った後はすべきではありません。そうしないとREWIND、ヘッダーをデータとして読み取ることになります。

したがって、完全な作業バージョンは次のようになります。

PROGRAM addsub
IMPLICIT NONE

CHARACTER(30)::file1
INTEGER:: i,err1
INTEGER ::dim1r,dim1c
REAL, ALLOCATABLE:: array1(:,:)


PRINT *, "What is the first filename?"
READ(*,*) file1

OPEN (UNIT=11, FILE=file1, STATUS="OLD", ACTION="READ", IOSTAT=err1)
IF (err1 .NE. 0) THEN
    WRITE(*,'(2A)')"There was an error opening ", file1
    STOP
END IF

DO i=1,1,1
    READ(11,*)dim1r, dim1c
END DO

ALLOCATE(array1(dim1r,dim1c))

DO i=1,dim1r
    READ(11,*) array1(i,1:dim1c)
END DO

DO i=1,dim1r
    PRINT *, array1(i,:)
END DO

DEALLOCATE(array1)

END PROGRAM addsub
于 2012-10-24T00:33:22.127 に答える