2016-09-16 14 views
0

首先,我不知道使用gfortran時綁定檢查是自動的。用下面的代碼:無法禁止綁定檢查

gfortran -Wno-array-bounds initial_parameters.f08 derrived_types.f08 lin_alg.f08 constitutive_models.f08 input_subs.f08 Subprograms.f08 mainprog.f08 

我還是收到編譯時警告:

Warning: Array reference at (1) is out of bounds (3 > 2) in dimension 2 

我可能是愚蠢的,但在這裏閱讀this,我認爲-Wno-array-bounds是應該禁止這種警告?用-w編譯成功禁止所有警告。

我不知道它是否相關,但是這些警告的來源是「Subprograms.f08」和「constitutive_models.f08」,它們都是包含子程序的模塊,並在主程序中使用。如果我嘗試編譯一個單獨的模塊

gfortran -Wno-array-bounds -c constitutive_models.f08 
+0

將gfortran與-fbounds-check設置爲默認值並不常見。您的編譯時檢查是您應該在源代碼中修復的另一個問題。 – tim18

+0

我沒有構建gfortran,我使用Ubuntu 16.04上的'sudo apt-get install gfortran'來安裝它。當然,這表明源代碼必須有一些東西。我會嘗試刪除gfortran並重新安裝它 - 這沒有什麼區別。 – 1QuickQuestion

+0

它可能不會在編譯時壓制檢查。除了增加運行時間之外,邊界檢查總是很好用。編譯器和計算機現在如此之快,爲什麼會擔心增加編譯時間? –

回答

3

我可以證實該編譯警告與gfortran(4.4)與這個簡單的代碼:

integer,parameter::dim=3 
integer :: x(2) 
if(dim.eq.1)write(*,*)x(dim) 
end 

警告:在(1)陣列參考超出範圍(3> 2)的2維

這可以說是被認爲是一個缺陷,因爲人們期望編譯器優化了整個if語句。注意ifort編譯這個就好了。

一個非常簡單的解決方法解決這個例子:

integer,parameter::dim=3 
integer :: x(2),dimx=dim 
if(dim.eq.1)write(*,*)x(dimx) 
end 
當然

因爲它只是一個警告,你知道它不是一個問題,您可以選擇忽略它呢!

注意在邏輯中使用該參數,以防編譯器覺得稍後優化它。

+0

如果啓用了綁定檢查,Ifort也會發出警告。 –

+0

問題是,有相當多的警告似乎淹沒了其他警告,可能有點更險惡。你的建議是一個很好的建議,並且幫助我去除了其中的大部分。 – 1QuickQuestion

2

發生

同樣的行爲因此,我可以建議是爲了處理數據使用重載的子程序 - 那麼你將有通用的行爲,而不需要將維度參數明確地傳遞給函數(從而擺脫警告)。然後,我建議您遵循Holmz關於在測試階段使用所有警告的建議,然後在生產構建期間將其完全關閉(-w)。現在我無法找到抑制此警告的有效方法(除了-w) - 似乎默認打開數組邊界檢查並且未覆蓋-fno-bounds-check或-Wno-array -bounds。但重載函數可以更好的解決您的問題,實施應該是這樣在這種情況下:

module functions 

    implicit none 

    interface test_dim 
     module procedure test_func1d, test_func2d, test_func3d 
    end interface ! test_dim 

    contains 

    subroutine test_func1d(input1d) 
     real, intent(in) :: input1d(:) 

     print*, "DOING 1 DIM" 
     print*, "SHAPE OF ARRAY:", shape(input1d) 
    end subroutine test_func1d 

    subroutine test_func2d(input2d) 
     real, intent(in) :: input2d(:,:) 

     print*, "DOING 2 DIM" 
     print*, "SHAPE OF ARRAY:", shape(input2d) 
    end subroutine test_func2d 

    subroutine test_func3d(input3d) 
     real, intent(in) :: input3d(:,:,:) 

     print*, "DOING 3 DIM" 
     print*, "SHAPE OF ARRAY:", shape(input3d) 
    end subroutine test_func3d 

end module functions 

program test_prog 
    use functions 

    implicit none 

    real :: case1(10), case2(20,10), case3(30, 40, 20) 

    call test_dim(case1) 
    call test_dim(case2) 
    call test_dim(case3) 
end program test_prog 

並通過此功能產生的輸出是這樣的:

DOING 1 DIM 
SHAPE OF ARRAY:   10 
DOING 2 DIM 
SHAPE OF ARRAY:   20   10 
DOING 3 DIM 
SHAPE OF ARRAY:   30   40   20 
+1

這是這種問題的標準做法嗎?問題是代碼很大,超過20-25個子程序。您的建議基本上將數量增加了三倍,意味着需要在3個不同的子程序中進行任何更改,這對我來說看起來像是一場災難!雖然如果這是常見的做法,那麼我想這只是一個咬子彈和做一個更好的程序員的問題。 – 1QuickQuestion

+0

我無法確定 - 我不知道你的問題。總的來說 - 是的。但是既然你提到你有很多子程序 - 這個方法可以修改。首先,所有這些子程序都有類似的簽名嗎?如果是的話 - 我會說這也可能是一個潛在的問題來源(至少它可能是混亂的根源)。如果沒有 - 那麼你可以嘗試按簽名對它們進行分組,爲每個組創建接口。但是,如果您能夠稍微詳細地描述您的問題 - 我可能會嘗試提出具體的解決方案。 – Chaosit

+0

另外接口是類型安全的 - 如果你用一個沒有實現的參數組合調用一個函數 - 那麼編譯器會抱怨那個 – Chaosit