2014-11-21 25 views
0

我(嘗試!)維護一個非常大的一組FORTRAN代碼。此代碼包含分散在各處的WRITE語句:捕獲Fortran中的寫例程

 WRITE(NOUT,2050)DAMPING 
2050 FORMAT(3X,'DAMPING =',F6.2,'%') 

我想要做的就是控制這些WRITE語句。原因是我們需要創建一個額外的輸出文件(有一些修改),並且複製語句的工作量太大。相反,我希望對它們進行修改......一種方式可能是有我自己寫程序:

 WRITEF(NOUT,2050)DAMPING 
2050 FORMAT(3X,'DAMPING =',F6.2,'%') 

     -------------------------------- 

     SUBROUTINE WRITEF(objectToWrite) 
     ... 
     Code to write out object 
     ... 
     END 

另一種可能是把寫語句作爲參數:

 WRITEF(WRITE(NOUT,2050)DAMPING) 
2050 FORMAT(3X,'DAMPING =',F6.2,'%') 

     -------------------------------- 

     SUBROUTINE WRITEF(characterToWrite) 
     ... 
     Code to write out character 
     ... 
     END 

但不幸的是我缺乏FORTRAN知識來知道這是否可能,以及如何實現它!

+0

第二個絕對不可能,因爲寫入不是返回值的函數。看起來你只能選擇重構代碼,以便在完成計算後將寫入語句收集到幾個子程序中。 – ja72 2014-11-21 15:17:55

+0

感謝您的反饋,但不幸的是代碼編寫的方式是不可能的 - 值被寫入文件,然後在計算正在運行時被遺忘/覆蓋... – qu1ckdry 2014-11-21 17:17:06

+0

請注意,格式只是問題的一部分。 'write'語句通常帶有任意長度的任意類型變量列表。有沒有乾淨的方式來使自己的功能,採取這樣的參數列表。你想做什麼*可能會成爲預處理器的工作。 – agentp 2014-11-21 22:56:23

回答

0

如果爲格式字符串交換FORMAT語句,你可以不喜歡

SUBROUTINE WRITE_REAL(unit,fmt, x) 
    INTEGER unit 
    CHARACTER(*) fmt 
    REAL x 
    write(unit,fmt) x 
    END 


    WRITEF(NOUT, "(3X,'DAMPING =',F6.2,'%')", DAMPING) 

但我離開你是否有用。我有點懷疑。

+0

如果我能夠以某種方式抓取格式語句而不是寫出來,那麼這種方法可能會有一些用處......'WRITEF(NOUT,,DAMPING)' – qu1ckdry 2014-11-21 17:18:49

+1

@ qu1ckdry不,如果你想做任何子程序重構你的輸出,並且你想傳遞格式,你必須刪除'FORMAT'語句並使用格式字符串。沒有辦法通過標籤(IIRC'ASSIGN'不會有幫助)。無論如何,「FORMAT」已經過時(可能不是正式的)。 – 2014-11-21 17:32:09