您可以使用使用表格-Wno-[warningname]
。任何未明確否定的警告仍會報告。對於你的情況,你可以使用:
-Wall -Wno-integer-division
編輯:注意-Wall
沒有被所有的編譯器(例如,ifort)。也就是說,如果您使用-Wall
,並且想要避免使用-Wno-integer-division
,那麼我不知道有什麼方法可以防止整數除法警告,而無需使用real
和int
來進行正確的轉換。
然而,正如你寧可不使用編譯器選項,找到多餘的類型轉換的麻煩,那麼只要你生活中可以沒有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)
的子程序。然後,任何嘗試改變它的值都會產生錯誤,所以你會得到相同的行爲。
@HighPerformanceMark這是一個簡化的例子。問題代碼的計算時間較長,其他文件中定義的參數依賴於預處理器定義,但仍需要整數除法,其中截斷是預期的。 – Jellby
我沒有這個版本的gfortran玩,但如果完全有效的代碼默認生成警告,那真的是不可接受的。它是否足夠聰明,以防止出現確切的整數結果(例如:'n *(n + 1)/ 2'? – agentp
@agentp它不是默認情況下,它與'-Wall'一起使用,它會給出許多其他警告一些有效的代碼(隱式轉換,未使用的變量等)我不喜歡的是,似乎沒有合理的,緊湊的編寫代碼的方式來避免警告(我不會調用'a = int (real(n)/ m)'「合理)但是,如果'n = 10',警告消失,我想知道爲什麼它沒有給出」可能被截斷「的警告(即不是常量)結果:如果(可能是故意的)截斷結果值得警告,那麼肯定可能截斷的結果也是值得的 – Jellby