2017-01-09 1 views
1

개선중인 프로그램에서 Fortran이 기존 파일을 감지하지 못하는 것으로 나타났습니다. 이로 인해 수정되지 않은 논리 오류가 발생했습니다. 나는 당신이 문제 또는 과실을 지적하고 저에게 당신의 개정을 줄 수 있으면 높게 평가한다.존재하지 않는 파일을 감지 할 수 없습니다.

open(unit=nhist,file=history,iostat=ierr)!This setting cannot exit program if file does not exist because ierr is always 0 
    if (ierr /=0) then 
    write(*,*)'!!! error#',ierr,'- Dump file not found' 
    stop 
    endif 

    !I used below statement, the program exits even though a file is existing 
     open(unit=nhist,file=history,err=700) 
    700 ierr=-1 
     if (ierr /=0) then 
     write(*,*)'!!! error#',ierr,'- Dump file not found' 
     stop 
     endif 

답변

2

여기에는 두 가지 명백한 문제가 있습니다. 별도로 살펴 보겠습니다.

먼저, 댓글이 ierr이 항상 0으로 설정되어 있는지 알 수

open(unit=nhist,file=history,iostat=ierr) 

을 고려하십시오. 음, 왜 이 0으로 설정되어서는 안됩니까? ierr은 오류의 경우 0이 아니어야하지만 오류가없는 파일입니까?

반드시 그렇지는 않습니다. status= 지정자가없는 경우 기본값 status='unknown'이 사용됩니다. 파일이 존재하지 않으면 컴파일러는이 경우 열기를 오류로 처리 할 필요가 없습니다. 글을 쓸 때 필요에 따라 작성하거나 읽을 때 불평 할 가능성이 있습니다.

open 문에 status='old'을 추가하는 것은 "파일이 있어야 함"이라고 말하는 일반적인 방법입니다. 오류가 여기 있다면

둘째,

 open(unit=nhist,file=history,err=700) 
    700 ierr=-1 
     if (ierr /=0) then 
     ... 

을 고려, 실행 700 표시된 문으로 전달된다. 이 문장에서 ierr이 0이 아닌 값으로 설정되고 해제되면 if 구조로 이동하여 오류를 처리합니다.

700이라는 문구도 오류없이 실행되는 것입니다. 이는 단지 open 다음 문이며 누락 된 분기가 없습니다. [그러한 분기의 예를들 수 있지만 현대 코드에서 err=의 사용을 권장하지 않으려합니다. . 작업으로 iostat= 가지]

훨씬 바람직하지만 그냥 파일의 존재 여부를 테스트 할 경우, 고려해야 문의-에 의해 파일 :

logical itexists 
inquire (file=history, exist=itexists) 
if (.not.itexists) error stop "No file :(" 

일부는이 주장을하는 것보다 더 나은입니다 open 문에 status='old'

+0

친애하는 Francescalus 님, 정말 고마워요! 예. 그것은 'status = old'를 추가 할 때 작동합니다. – Leon

관련 문제