2012-08-08 71 views
1

Fortran新手在這裏,我被要求使用Salford/Silverfrost編譯器(原始開發人員過世)編寫Fortran 77編寫的舊Fortran代碼庫。Fortran COMMON塊初始化

最初的開發者使用命名COMMON塊廣泛(模擬全局變量,AFAIU)和他使用EQUIVALENCE(重新)初始化塊需要像這樣的代碼片段時:

 IMPLICIT REAL*8 (A-H,O-Z) 

     COMMON/COMMF2D/ 
    * ASCN(0:99,0:20,0:4) 
    *,FEMPTY2(8700) 

     DIMENSION KLCKF2D(38400) 
     EQUIVALENCE (KLCKF2D,ASCN) 

     DO I= 1,38400            
     KLCKF2D(I)= 0 
     END DO 

這是一個可接受的編程練習還是隻是一個黑客?另外,由於我試圖將代碼移植到GFortran,它是否便攜? (據我所知,像REAL*8聲明只是提示編譯器,並且不保證)

+1

說到可移植性,對於類型大小(如REAL * 8)或類型類型(如REAL(KIND = 8)),不使用硬編碼常量值的代碼是可移植的。在便攜式Fortran 90+代碼中,您應該調用'SELECTED_REAL_KIND()'以獲得保證一定精度和指數範圍的類參數。 – 2012-08-08 16:34:55

回答

6

EQUIVALENCE任何事情,它肯定不intialise什麼,一個EQUIVALENCE是一個定義或聲明。現在(自從Fortran 90標準發佈以來,一直在增長的力量)EQUIVALENCE是一種破解,應儘可能避免。

聲明聲明2個變量共享存儲(Fortran標準調用存儲關聯)。對此的一種解釋是,等價的名稱只是別名,但(聲明)使用聲明允許程序員做其他事情,21世紀的專業軟件工程師認爲這些其他的事情是狡猾的。

例如,這適用於您發佈的代碼片段,EQUIVALENCE可用於使不同類型的變量共享相同的存儲空間。您有一個名爲ASCN的數組,它是(隱含地)類型REAL*8等同於名爲KLCKF2D的數組,該數組(類似地)是INTEGER。這意味着如果你使用一個名稱來指代存儲,位模式被解釋爲REAL s,使用其他名稱,它們是INTEGER s - 並且注意具有值100.0的實值的位模式不會(當然)被解釋爲整數100

而駭客並不止於此。 COMMON塊聲明的一個作用是將變量放在內存中,在這種情況下,10500 (= 100*21*5)元素的ASCN後面跟着FEMPTY28700元素。通過一些乘法和加法,你會發現38400 = 2*(10500+8700)在這個程序中符合默認的整數大小是4字節,即在其他變量中使用的REAL*8的大小的一半。因此,數組KLCKF2D大於ASCN,但原始程序員知道下一個17400字節將被FEMPTY2佔用。

所以是的,這可能是將程序內存數據的那部分中的所有位設置爲0的一種方式,但它(現在被認爲是)可怕的黑客攻擊。但它應該是可移植的 - 連續的Fortran標準對於從語言和編譯器編寫者中刪除過時的功能甚至更加保守,向後兼容性對於Fortran程序員來說非常重要。

哦,並回答你的問題,是的COMMON塊(注意過去式)FORTRAN77聲明和使用全局變量的方式。現在,語言提供了更爲安全的選項,通過將變量包含在MODULEUSE中 - 將它們關聯起來,從而將變量聲明爲全局共享。

,我也不會驚訝地看到像

COMMON/COMMF2D/KLCKF2D(38400) 

一行在你的代碼,COMMON塊也可以是(AB-)用於重命名並重新輸入存儲位置。

雖然我給你的舊代碼一個踢,隱式鍵入也皺眉,這些日子,明顯更好地鍵入所有的聲明。

+1

謝謝@Mark!是的,我知道「EQUIVALENCE」只是一個聲明;可憐的措辭在我身邊。 – Wolfy 2012-08-08 15:31:41