2013-08-14 4 views
1

재귀 서브 루틴에서 생성 된 파일에 내 결과를 쓰고 싶었습니다. 또한 파일의 데이터 (읽기)를 fortran90의 메인 프로그램에있는 배열에 할당하려고했습니다.recursive 서브 루틴에서 open 문

program permutations 
    implicit none 

    call generate (position_min) 

    open(unit=20, file="a.dat", status="old") 
    do i=1,720 
    read(20,*)(G(i,j),j=1,6) 
    end do 
contains 
recursive subroutine generate (position) 
    implicit none 
    integer, intent (in) :: position 
    integer :: value 

    if (position > position_max) then 
    open(unit=20, file="a.dat", status="unknown") 
    write (20, *) permutation 
    else 
    call generate(position+1) 
    end if 

end subroutine generate 
end program permutations 

이 프로그램은 다음 런타임 오류를 제공합니다.

At line 19 of file p2.f90 (unit = 20, file = 'a.dat') 
Fortran runtime error: End of file 

어떻게 수정합니까?

+1

분명히 파일의 길이가 720 줄이 아니고 한 줄에 6 개의 정수가 있습니다. 그보다 작습니다. 좋아하는 텍스트 편집기를 사용하여 실제로 몇 줄이 있는지 확인하십시오 (그리고 6 개의 정수가 모두있는 경우). 그런 다음 코드를 적절하게 편집하십시오. –

+2

단위 20을 쓰지 않고 닫은 상태입니다. – cup

답변

0

대답은 주로 질문에 대한 내 의견이라고 생각합니다. 당신이 당신의 코드를 보면 특히 재귀 서브 루틴의 if -statement, 당신은 당신이 그

if (position > position_max) then 
    open(unit=20, file="a.dat", status="unknown") 
    write (20, *) permutation 
else 
    call generate(position+1) 
end if 

이 점에 유의해야합니다 (선언되지 않은 변수 문제를 무시), 당신은 을 제기 할 작성 ifposition > position_max. 이 조건을 만족하면 행이 a.dat으로 작성되고 모두 이전의 if 문을 완료합니다. 아마도 당신이 가지고 있었던 것은 재귀 루프를 통해 각각 시간을 시간 동안 기록한 것입니다. 그렇게, 당신이 이것을 실행에

open(20,file="a.dat",status="unknown") 
write(20,*) permutation 
close(20) 
if(position > position_max) then 
    return 
else 
    call generate(position+1) 
endif 

같은 것을 원하는 것, 내가 (때문에 position=position_min에 쓰기로하고 position=position_max에서) 2 개 여분의 줄을 얻고 있었다 발견했다. 당신은 아마 정확히 720을 얻을 것을 조정할 수 있지만 다음과 같은

i=1 
do 
    read(20,*,iostat=ierr) G(i,:) 
    if(ierr/=0) exit 
    i = i+1 
enddo 

read 루프를 변경할 수 있기 때문에 나는 정상적인 읽기 0의 iostat 반환이 부분은 무관하다고 생각하고 파일 끝 -1을 반환하므로 읽을 수있는 한 루프를 계속하고 EOF가 발견되면 중단됩니다.

선언되지 않은 변수를 수정하고 close(20) 문을 추가하고 위에서 설명한대로 조정하면 재귀 적 서브 루틴에서 쓰고 읽는 데 아무런 문제가 없습니다.

관련 문제