2017-08-26 106 views
1

在gfortran 6中,有一個新的警告-Winteger-division,當一個值被整數除法截斷時觸發,如3/5如何避免整數除法警告?

假設這是預期的結果,有沒有辦法改變代碼,使警告不發出?例如:

program test 
integer, parameter :: n = 3, m = 5 
integer, parameter :: a = n/m 
end program 

至少一些不太麻煩比:

integer, parameter :: a = int(real(n)/real(m)) 

我想用-Wall(和-Werror)留着,我寧願修改代碼比編譯器選項撥弄具體的文件,以及特定的編譯器版本等。

+0

@HighPerformanceMark這是一個簡化的例子。問題代碼的計算時間較長,其他文件中定義的參數依賴於預處理器定義,但仍需要整數除法,其中截斷是預期的。 – Jellby

+0

我沒有這個版本的gfortran玩,但如果完全有效的代碼默認生成警告,那真的是不可接受的。它是否足夠聰明,以防止出現確切的整數結果(例如:'n *(n + 1)/ 2'? – agentp

+0

@agentp它不是默認情況下,它與'-Wall'一起使用,它會給出許多其他警告一些有效的代碼(隱式轉換,未使用的變量等)我不喜歡的是,似乎沒有合理的,緊湊的編寫代碼的方式來避免警告(我不會調用'a = int (real(n)/ m)'「合理)但是,如果'n = 10',警告消失,我想知道爲什麼它沒有給出」可能被截斷「的警告(即不是常量)結果:如果(可能是故意的)截斷結果值得警告,那麼肯定可能截斷的結果也是值得的 – Jellby

回答

1

您可以使用使用表格-Wno-[warningname]。任何未明確否定的警告仍會報告。對於你的情況,你可以使用:

-Wall -Wno-integer-division 

編輯:注意-Wall沒有被所有的編譯器(例如,ifort)。也就是說,如果您使用-Wall,並且想要避免使用-Wno-integer-division,那麼我不知道有什麼方法可以防止整數除法警告,而無需使用realint來進行正確的轉換。

然而,正如你寧可不使用編譯器選項,找到多餘的類型轉換的麻煩,那麼只要你生活中可以沒有a是一個parameter(即,只是一個普通的integer),你可以寫一個爲您完成所有顯式轉換的過程。例如:

module utility_fcns 
    implicit none 
contains 
    integer function intdiv(i1, i2) result(this) 
     integer, intent(in) :: i1, i2 
     this = int(real(i1)/real(i2)) 
    end function intdiv 
end module utility_fcns 

program test 
    use utility_fcns, only: intdiv 
    implicit none 

    integer :: a 
    integer, parameter :: n = 3, m = 5 

    a = intdiv(n,m) 
    print *, a 
end program test 

因此,使用intdiv(n,m)是打字有點少,但結果是沒有一個參數...

如果這是一個致命弱點,那考慮將a傳遞給intent(in)的子程序。然後,任何嘗試改變它的值都會產生錯誤,所以你會得到相同的行爲。

+0

是的,這就是我說我不想做的事情... – Jellby

+0

@Jellby啊,我現在明白了。我做了一個編輯,並提供了一個替代建議。 –

+0

感謝您的嘗試,但是當'a'用於標註靜態數組時,它並沒有幫助。使用從Fortran77時代開始的代碼庫,我希望將更改保持在最低限度。好的一面:它抓住了一個錯誤('m + 3/2'而不是'(m + 3)/ 2')。 – Jellby