2013-11-25 115 views
-1

我最近開始研究現有的Fortran程序,並在同一時間提取語言。我寫了下面的子程序:Fortran子程序掛在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 

該子程序的目的是把它寫從一個文件的程序的其他部分,下面定義的格式(不包括在我的例子格式定義)獲得的輸入。該文件必須在此子例程的第一次調用時創建,然後在每次進一步調用時訪問以添加新信息。 diroutput是在myglobals中定義的字符串。

我的問題是,該程序似乎掛在OPEN聲明,即沒有任何反應,直到我殺死進程。我用幾個print*,語句運行代碼來查找錯誤,並以這種方式發現錯誤必須在OPEN聲明中。程序看起來很奇怪,甚至沒有跳到錯誤標籤。

由於我是Fortran新手,我可能會漏掉一些相當明顯的東西,所以更有經驗的人快速查看可能會有所幫助。我確定diroutput包含一個有效的路徑。

我正在使用Linux(CentOS 5.5),並使用英特爾Fortran編譯器11.1編譯了我的程序。

+1

你知道'diroutput'有69個字符嗎?也許使用'trim(diroutput)'。我建議學習Fortran 95/2003而不是FORTRAN 77.特別是,如高性能標記所提到的,免費源代碼形式更容易。請參閱http://en.wikipedia.org/wiki/Fortran_95_language_features –

+0

您應該打印ios,而不是iostat。在myglobals中是format_str ?. err = 450實際上什麼都不做,因爲無論錯誤如何,你都會到達那條線。 Nono這應該導致它掛起。 – agentp

+0

@ M.S.B。感謝提示,我想我從現在開始肯定會使用Fortran的新版本。 'diroutput'包含我的路徑和一些額外的字符,所以這是我找到路徑的唯一途徑。它給了我正確的道路。謝謝@george發現我的其他錯誤。 'format_str'實際上是在這個子程序中定義的,我拿出來簡化了我的例子,並忘記在那一行上改變它。 –

回答

0

儘管包含了Fortran 90的功能,但您的代碼似乎仍以固定形式從(一般)第6列中的連續字符開始書寫。如果它是固定形式,則語句標籤(例如450應位於列1到5.我不會立即明白爲什麼會導致程序掛起而不是崩潰,但我建議您修復此問題並重試。

+0

我仍然無法確定究竟是什麼原因導致了問題,但它可能是一個表單問題,因爲將我的文件保存爲.f90並相應地修改它也有訣竅。 '450'的位置是正確的,但我忘記調整格式時,我複製粘貼我的代碼 - 對此感到抱歉。 –