我有一個程序,它分配一個超出它的邊界的數組,我期待一個運行時錯誤被拋出。然而,沒有任何錯誤發生,程序繼續寫入未聲明的內存。有沒有一些編譯器選項來防止這種情況發生?顯示內存轉儲清楚地表明這種邊界的超越是真實的。有沒有辦法聲明變量或參數規格來捕捉這個?顯然這是一個明顯的例子,但是當要維護數千行F77派生代碼時,如果這可能發生,並不總是清楚(對我來說)。爲什麼清晰寫入數組邊界時沒有運行時錯誤?
PROGRAM TEST_CODE
IMPLICIT NONE
INTEGER*4 :: R(5) ! Array of 5
CALL R_TEST(R, 10)
END PROGRAM
SUBROUTINE R_TEST(R, J)
IMPLICIT NONE
INTEGER*4, INTENT(INOUT) :: R(1) ! Dummy is array of 1
INTEGER*4, INTENT(IN) :: J
INTEGER*4 :: K
DO K=J-5,J+5 ! K=5..15
R(K) = K ! No Runtime Error
END DO
END SUBROUTINE
編譯器是英特爾Fortran 2011 XE,是的,我現在用的字節規範INTEGER*4
,因爲我知道我得到它。
以下是用於運行時檢查的編譯器選項。
感謝您的回答。如果編譯器不能承擔連續內存,它如何處理數組索引。是不是每個數組都增加一個固定的距離,比如前面的一個,就像C數組一樣? – ja72 2012-03-27 17:18:39
不,像R(:)這樣的假定形狀數組不能保證是連續的。 C沒有數組(指針不計數!)。雖然,C中有方法來創建連續的數組指針(請參閱http://stackoverflow.com/questions/5196318/reallocation-of-contiguous-2d-array)。在Fortran中,你可以簡單地測試它。我測試過,當我使用allocatable屬性時,性能提升了10-15%。當你混合使用C/Fortran編程時,你可以將R(:)映射到C類型的指針數組。 – 2012-04-18 12:23:20