2011-04-12 71 views
4

使用GNU Fortran(v4.4.3)或Sun Studio F95(v8.3)進行編譯時,並且沒有數組邊界檢查以下程序運行沒有錯誤。然而,當數組邊界檢查上(gfortran -fbounds-checkf95 -C,分別)切換GNU編譯的可執行文件再次運行沒有錯誤,而太陽錄音室編譯的可執行文件給出了運行時錯誤,零大小陣列和數組邊界檢查

****** FORTRAN RUN-TIME SYSTEM ****** 
Subscript out of range. Location: line 44 column 20 of 'nosize.f90' 
Subscript number 2 has value 1 in array 't$27' 

這是一個錯誤的調用sub2(),該函數使用x的自動數組僞參數。 sub1()調用與編譯器和任何標誌都可以正常運行。

據我所知,這個程序是「合法的」,因爲零大小的數組可能被引用爲非零大小的數組,並且沒有明確索引x的零長度維數。但是有沒有一些零大小的數組切片或自動數組微妙,我在這裏失蹤?我應該期望數組邊界檢查在不同的編譯器中表現相同,還是應該將其視爲特定於供應商的擴展?

MODULE subs 
    IMPLICIT NONE 
CONTAINS  
    SUBROUTINE sub1(x) 
    IMPLICIT NONE 
    REAL :: x(:,:) 
    PRINT*,'------------------------------------' 
    PRINT*,SHAPE(x) 
    PRINT*,SIZE(x) 
    END SUBROUTINE sub1 

    SUBROUTINE sub2(n1,n3,x) 
    IMPLICIT NONE 
    INTEGER,INTENT(in) :: n1, n3 
    REAL :: x(n1,n3) 
    PRINT*,'------------------------------------' 
    PRINT*,SHAPE(x) 
    PRINT*,SIZE(x) 
    END SUBROUTINE sub2 
END MODULE subs 


PROGRAM nosize 
    USE subs 
    IMPLICIT NONE  
    INTEGER :: n1 = 2, n2 = 2, n3 = 0 
    REAL,ALLOCATABLE :: x(:,:,:) 

    ALLOCATE(x(n1,n2,n3)) 
    x(:,:,:) = -99.9 

    PRINT*,'ALLOCATED? ',ALLOCATED(x) 
    PRINT*,'SHAPE =',SHAPE(x) 
    PRINT*,'SIZE =',SIZE(x) 
    PRINT*,'X  =',x 

    CALL sub1(x(:,1,:)) 
    CALL sub2(n1,n3,x(:,1,:)) 

END PROGRAM nosize 

回答

3

它不會給intel fortran編譯器帶來任何問題,而且帶有-check bounds;和IBM的xlf,在我的經驗中非常嚴格,也沒有用-qcheck抱怨。

但更廣泛地說,是的,關於邊界檢查應該或不應該做什麼沒有標準。我當然可以看到爲什麼一些編譯器標記爲一個零長度數組的賦值爲壞/錯/奇怪;這是一個奇怪的角落案例。

+2

是的,這就是我所懷疑的,Sun有突出的表現。哦,這只是說明我需要說服代碼擁有者將許多子程序包裝在模塊中,而不是繼續使用標準遵從之劍。 – Deditos 2011-04-12 20:42:46