2013-04-15 63 views
2

我正在修改一些舊的Fortran代碼(我想是F77),以便與英特爾編譯器一起編譯。我以這種形式遇到一些SLATEC例程來了:Fortran隱式更改類型

subroutine cffti (n,wsave) 

    dimension wsave(1) 

    iw1 = n+n+1 
    iw2 = iw1+n+n 
    call cffti1 (n,wsave(iw1),wsave(iw2)) 

    return 
    end subroutine cffti 


subroutine cffti1 (n,wa,ifac) 

    .... 
    .... 
end subroutine cffti 

Wsave是一個數組,其第一個部分是應該存儲浮點數,而第二(從IW2)來存儲整數。

所有的變量都是隱式的,所以當wsave(iw2)被傳遞給ifac被解釋爲一個整數並且ifac中的值沒有意義時。

我感到困惑:所有這些東西怎麼能正確工作? 我該如何克服這個問題?

回答

2

這種轉換來正確填充數據可以使用Fortran 77中的EQUIVALENCE來完成。爲了同樣的目的,Fortran 95提供TRANSFER

​​

接收數據不是問題,因爲隱式接口只傳遞指針而不檢查類型。如果你需要使用顯式接口的內部部分,你可以在裏面使用相同的接口。

在現代代碼中,只需使用2種不同類型的數組,並遠離這些技術。

1

在VF的答案上詳細地闡述了一下 - 很可能cffti1使用該整數數組作爲暫存空間,以便在其他地方永遠不會訪問這些值。即。您可能無法找到(或需要)等同或轉移語句。最高級別子程序的文檔可能會提到類似「wsave應聲明爲4n + 1,結果要在第一個2n值中返回」。

在這種情況下,爲了「代碼化」可能會取消ifac參數,並在子程序中分配臨時空間。但我不願意在沒有詳細研究代碼的情況下做出這樣的改變。

這就是說,你有什麼「問題」?您可能只需要關閉一些過分激進的類型檢查。


編輯,在這裏找到文檔http://www.maths.bris.ac.uk/~marp/slatec/routin-j.htm

WSAVE a work array which must be dimensioned at least 4*N+15... 

「工作數組」 - >> 「暫存空間」 - >不與內容關心自己..