2014-05-08 4 views
5

필자는 FORTRAN을 오래 전부터 사용해 왔으며 최근에는 이전 FORTRAN 프로그램 (F77)을 유지 관리하는 임무를 수행했습니다. 다음 코드는 익숙했다 :포트란 암시 루프 명확화

 READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS, 
    . (BUFFER(BIX), BIX=1, NUM_WORDS) 

일부는 온라인 포럼이 저를 혼동 한 부분은 계속 라인, 묵시적 루프 것으로 나타났다 검토. 내 프로그램이 바로 여기에서 문제를 일으키고 있기 때문에 이것을 일반적인 DO 루프로 변환하려고합니다. 그것을 변환하는 것은 5 년 후에 추운 위로이 것을 고르는 다음 가난한 물방울을 도울 것입니다! 어쨌든, DO 루프 상응하는 나의 추측은

READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS 
    DO BIX=1, NUM_WORDS 
    READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) BUFFER(BIX) 
    ENDDO 

이다 그러나 나는 단지이 변경했을 때, 작업하는 테스트 케이스가 작동을 멈췄습니다. 나는 여전히 두 가지 다른 READ (처음에는 NUM_WORDS를 얻고 두 번째는 데이터를 반복하는 것) 때문에 덜 급격한 변화를 시도했지만 두 개의 명령문으로 변환했지만 암시 된 루프는 그대로 유지한다고 생각했습니다.

READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS 
    READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) (BUFFER(BIX), BIX=1, NUM_WORDS) 

하지만이 변경으로 인해 좋은 테스트 케이스가 실패하게됩니다. 두 가지 변경 사항 모두에서 NUM_WORDS의 가치가 예상대로 향상되어 루프가 실패한 것으로 보입니다.

그래서 원래의 암시 루프에 해당하는 DO 루프는 무엇입니까? 아니면 내가 잘못된 길을 가고 있는가?
감사합니다.

+0

답변 해 주셔서 감사합니다. janneb. 파일 열기에 대한 가정은 정확합니다. 포맷되지 않은 순차적 사용하고 있습니다. 그리고 당신의 대답을 통해 나는 더 중요한 문제가 읽기라는 것을 알았고 그것이 기록을 읽는다는 사실을 잊어 버렸습니다. – user3617977

답변

3

파일은 어떻게 열 냅니까? 나는. 그것은 ACCESS = 'sequential', access = 'direct', 또는 access = 'stream'입니까? (글쎄요, 마지막은 F2003 추가 사항과 같지 않습니다). 둘째, 형식이 지정되었거나 형식이 지정되지 않았습니까? 필자는 read 구문에서 REC = 지정자 또는 형식 지정자가 없으므로 형식이 지정되지 않은 순차적이라고 가정합니다.

당신이 실패하려고하는 이유는 각 읽기 명령문이 별도의 레코드를 읽는 것입니다. F2003에서 access = 'stream'을 도입하기 전에 Fortran I/O는 완전히 다른 기반 언어였습니다. 대부분의 다른 언어에서 볼 수 있듯이 형식 파일을 스트리밍하는 데 사용 된 것과는 약간 다른 것입니다.

포맷되지 않은 순차 파일의 레코드는 일반적으로 레코드의 각 끝에 "레코드 마커"로 구분됩니다. 대개 레코드 길이를 지정하는 4 바이트입니다. 그래서 (디스크상의) 기록은 다음과 같이 보입니다.

| 길이 (4 바이트) | num_words (4 바이트?) | 버퍼 (1) | 버퍼 (2) | ... | 길이 |

이제 num_words를 하나의 READ 문으로 읽으려고하면 파일에서 num_words를 올바르게 읽습니다. 그러면 다음 레코드가 시작될 때까지 앞으로 건너 뜁니다. 그리고 나서 별도의 READ 문으로 버퍼를 읽으려고하면 이미 파일에서 너무 멀리 떨어져 있습니다. 당신이 조금 사용 F90 + 배열 구문을 속임수 경우가 작성되고있는 같은 성명에서 NUM_WORDS을 참조 할 수 있다면 잘 모르겠어요하지만

, 당신은 (

READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS, BUFFER(1:NUM_WORDS) 

멀리 얻을 수 있습니다 to)