2017-08-26 104 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