2012-12-18 29 views
1

使用gfortran編譯時,是否可以使用實數作爲迭代器和數組索引?以下是一些示例代碼:gfortran:使用實數作爲數組索引

program test 
    real i 
    real testarray(5) 
    testarray = 0. 
    do i=1,5 
     write(*,*) testarray(i) 
    end do 
end program 

我想運行一些我沒寫的代碼。它在Windows上編譯好intel編譯器,但我想用gfortran編譯器在linux中編譯和運行它。我目前正在使用實數作爲數組索引並執行循環迭代器。

謝謝!

+0

我有一個代碼,其中有一個循環,它使用實數來迭代「do」循環(我不知道那個循環做了什麼,因爲我沒有自己寫)。無論如何,'gfortran'編譯它就好(但每次都會發出警告) - 這些日子裏,我可能會去那裏修復它... – mgilson

回答

1

爲什麼要使用實數作爲數組和循環索引?

如果需要使用索引的真實價值,這樣做:

program test 
    integer i 
    real testarray(5) 
    testarray = 0. 

    do i=1,5 
     testarray(i) = REAL(i) 
    end do 
end program 

當然,如果你需要,你可以去另一個方向,

integer j 
do j = 1, INTEGER(testarray(1)) 
... 
end do 

例如。該標準不允許非整數索引。它們也沒有意義 - 數組中的1.5索引是多少?

看起來真實數組索引是extension,如果使用--std=gnu進行編譯,這應該是可能的。但對此的支持可能並不總是存在,因爲它不是標準的一部分。

+0

我不希望*使用真正的數組索引。我只是有一堆代碼,我沒有寫,其中一些是sl。的。它使用intel編譯器在Windows上編譯和運行良好。我只是想知道是否有一個gfortran編譯器的設置可能會「放鬆」它足以運行。也許我必須經歷和調試,但我只是想知道是否有一種簡單的方法可以通過編譯器,因爲它似乎可以在intel上正常工作。 –

+0

@FluxCapacitor我在最後添加了一些東西,你可以試試'--std = gnu'選項,但是它又不是標準的一部分,不應該被期望工作。 – tpg2114

+3

@FluxCapacitor我也明白你繼承了凌亂的代碼,但我不希望有人過來想「哦,我可以在我寫的代碼中使用真正的數組索引?太棒了!」所以我必須指出,這是一個壞主意,即使你無法避免:) – tpg2114

1

如果您不想看到警告,請嘗試--std = legacy。如已經暗示的那樣,否則是「gnu」。所述gfortran手冊指出:

作爲擴展,GNU的Fortran允許使用REAL表達式或 變量數組的索引。

性病的缺省值是「GNU」,它指定了 Fortran 95標準,包括所有通過 GNU的Fortran支持的擴展的超集,雖然警告將被給定對於過時的擴展 不建議在新代碼中使用。 「傳統」值相當於 ,但沒有過時擴展的警告,對舊的非標準程序可能有用 。

使用實數變量作爲循環索引已從使用Fortran 95的語言標準中刪除。由於使用此語言的遺留代碼數量很大,因此可能會在編譯器中保留數十年。

0

另一種可能性是將其作爲函數或子例程來實現。用戶體驗類似於數組或類似函數,但會允許更多的控制(例如,您可以檢查x是否在您爲其定義值的x0的某個值的eps範圍內)。

總的來說,這個想法由於舍入誤差而顯得很危險。

如果您正在研究有理數或假設srqt是整數分數,那麼當f(x)作爲函數適用時(與x相比,包含分子和分母的派生類型)。

所以我最後的答案是:把它寫成一個函數。