使用GNU Fortran(v4.4.3)或Sun Studio F95(v8.3)進行編譯時,並且沒有數組邊界檢查以下程序運行沒有錯誤。然而,當數組邊界檢查上(gfortran -fbounds-check
和f95 -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
是的,這就是我所懷疑的,Sun有突出的表現。哦,這只是說明我需要說服代碼擁有者將許多子程序包裝在模塊中,而不是繼續使用標準遵從之劍。 – Deditos 2011-04-12 20:42:46