2013-11-25 2 views
-1

저는 최근에 기존의 포트란 프로그램을 작업하고 동시에 언어를 선택하기 시작했습니다.OPEN 문에 포트란 서브 루틴이 끊어졌습니다.

subroutine timing(yyyy, mm, dd, var, ntime, time_blocks, 
* time_day) 

use myglobals 

! --------------------------------------------------------------------- 
!  Common Variables 
! ---------------------------------------------------------------------  

    integer yyyy,  ! year 
    *   mm, ! month 
    *   dd, ! day 
    *   ntime ! nr of blocks for which time was measured 

    real time_blocks(ntime),  
    *  time_day  
    character*4 var 

! --------------------------------------------------------------------- 
!  Internal Variables 
! --------------------------------------------------------------------- 

    integer ios 
    integer out_unit=52 

     open(unit=out_unit, file=diroutput(1:69)//'timing', 
    * err=450, iostat=ios) 
    450 print*, "iostat= ", iostat 
    print*, "open" 

    write(out_unit, format_str) yyyy, mm, dd, var, time_blocks, 
    * time_day 

    return 
    end 

이 서브 루틴의 목적은 그것이 정의 된 형식 (내 예에 포함되지 않은 형식 정의) 다음 파일에 프로그램의 다른 부분에서 얻는 입력을 작성하는 것입니다 : 나는 다음과 같은 서브 루틴을 썼다. 이 서브 루틴의 첫 x 째 호출시 파일을 작성한 다음 추가 정보를 추가 할 때마다 호출 할 때마다 파일을 액세스해야합니다. diroutputmyglobals에 정의 된 문자열입니다.

내 문제는 프로그램이 OPEN 문에서 멈추는 것처럼 보입니다. 즉, 프로세스를 죽일 때까지 아무 일도 일어나지 않습니다. print*, 문을 사용하여 코드를 실행하여 오류를 찾은 다음 오류가 OPEN 문에 있어야한다는 것을 알았습니다. 프로그램이 전혀 아무것도하지 않는 이상한 것처럼 보이며 심지어 오류 레이블로 건너 뛰지도 않습니다.

Fortran을 처음 접했을 때 나는 뭔가 빠져 있었기 때문에 좀 더 경험이 많은 사람이 빨리 살펴 보았을 것입니다. diroutput에 올바른 경로가 포함되어 있다고 확신합니다.

저는 Linux (CentOS 5.5)를 사용 중이며 Intel Fortran Compiler 11.1로 프로그램을 컴파일했습니다.

+1

'diroutput'은 정확하게 69 문자를 가지고 있다는 것을 알고 계십니까? 아마도'trim (diroutput)'을 사용하십시오. FORTRAN 77 대신 Fortran 95/2003을 배우는 것이 좋습니다. 특히, High Performance Mark에서 언급했듯이 무료 소스 형식이 더 쉽습니다. http://en.wikipedia.org/wiki/Fortran_95_language_features –

+0

을 참조하십시오. iostat가 아닌 ios를 사용해야합니다. myglobals에 format_str이 있습니까? err = 450은 오류에 관계없이 해당 행에 도달하기 때문에 실제로 아무 것도 수행하지 않습니다. 이것의 Nono는 그것이 걸리게 할 것입니다. – agentp

+0

@ M.S.B. 팁을 주셔서 감사합니다. 지금부터는 Fortran의 최신 버전을 사용할 것입니다. 'diroutput'에는 내 경로와 몇 가지 추가 문자가 포함되어 있으므로 경로를 찾는 유일한 방법이었습니다. 그것은 나에게 올바른 경로를 제공합니다. 내 다른 실수를 발견해 주셔서 감사합니다. 'format_str'은 실제로이 서브 루틴에서 정의되었습니다. 예제를 단순화하고 그 라인에서 변경하는 것을 잊었습니다. –

답변

0

코드는 (일반적으로) 열 6의 연속 문자에서 Fortran 90의 기능을 포함하고 있지만 고정 된 형식으로 작성된 것 같습니다. 고정 양식이면 450과 같은 명령문 레이블은 열에 있어야합니다 1에서 5까지. 나는 그것이 프로그램이 충돌보다는 멈추는 원인이되는 이유를 즉시 알지 못한다. 그러나 나는 이것을 고치고 다시 시도 할 것을 제안한다.

+0

여전히 문제의 원인을 정확히 파악할 수는 없지만 .f90으로 파일을 저장하고 그에 따라 수정하면 트릭이 발생하므로 양식 문제 일 수 있습니다. '450'의 위치는 정확했지만 코드를 복사하여 붙여 넣을 때 형식을 조정하는 것을 잊었습니다. 죄송합니다. –

관련 문제