2016-06-12 2 views
1

이 프로그램은 비주얼 포트란 (잘못된)에서포트란

program test 

    real a(10) 

    open(1, file='f1',access='direct', recl=20) 
    do i=1, 10 
     a(i) = i-1 
    end do 
    write(1, rec=1)(a(i),i=1,5) 
    write(1, rec=2)(a(i),i=6,10) 
    close(1) 
    open(1, file='f1',access='direct',recl=8) 
    read(1, rec=4)(a(i),i =5,9,4) 
    print*,a 
    end 

작품 잘못된 시각 인텔 : 와트 컴에서

0.0000000E+00 1.000000  2.000000  3.000000  9.000000 
    5.000000  6.000000  7.000000  0.0000000E+00 9.000000 

결과 (올바른) :

0.0000000 1.0000000  2.0000000  3.0000000  6.0000000 
    5.0000000 6.0000000  7.0000000  7.0000000  9.0000000 

왜?

답변

1

Visual Fortran에서 RECL의 기본 단위 길이는 단어 (4 바이트)입니다. '포맷되지 않은 파일에 대해 RECL = 단위로 바이트 사용'(/ assume : byterecl) 옵션을 사용하여 컴파일하면 원하는 결과를 얻을 수 있습니다.

2

코드를 작성할 때 레코드가 얼마나 긴지 정확히 알 필요는 없습니다. recl=20 또는 recl=5으로 설정하고 컴파일러의 정확한 동작 및 정확한 real 크기에 따라 향후 문제를 해결할 수 있습니다.

당신은 사용 중 단위로 레코드의 크기에 대한 컴파일러를 요청해야합니다 :

integer :: recl5, recl2 

inquire(iolength=recl5) (a(i),i=1,5) 

open(1, file='f1',access='direct', recl=recl5) 


... 


inquire(iolength=recl2) (a(i),i =5,9,4) 
open(1, file='f1',access='direct',recl=recl2) 

참고 : 포트란 90에서는이 부분 배열 표기법을 사용하여 훨씬 더 짧은 수 있습니다.

주 2 : 일부 컴파일러의 경우 컴파일러가 파일에 레코드 끝 표시를 사용할 수 있으므로 프로그램이 작동하지 않으므로 항상 동일한 recl으로 열어야합니다. 하지만 그건 일반적인 것이 아닙니다.