我最近開始研究現有的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編譯了我的程序。
你知道'diroutput'有69個字符嗎?也許使用'trim(diroutput)'。我建議學習Fortran 95/2003而不是FORTRAN 77.特別是,如高性能標記所提到的,免費源代碼形式更容易。請參閱http://en.wikipedia.org/wiki/Fortran_95_language_features –
您應該打印ios,而不是iostat。在myglobals中是format_str ?. err = 450實際上什麼都不做,因爲無論錯誤如何,你都會到達那條線。 Nono這應該導致它掛起。 – agentp
@ M.S.B。感謝提示,我想我從現在開始肯定會使用Fortran的新版本。 'diroutput'包含我的路徑和一些額外的字符,所以這是我找到路徑的唯一途徑。它給了我正確的道路。謝謝@george發現我的其他錯誤。 'format_str'實際上是在這個子程序中定義的,我拿出來簡化了我的例子,並忘記在那一行上改變它。 –