Fortran 如何避免整数除法警告?

Fortran 如何避免整数除法警告?,fortran,compiler-warnings,gfortran,Fortran,Compiler Warnings,Gfortran,在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)) 我想继

在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
),我宁愿修改代码,也不愿修改特定文件、特定编译器版本等的编译器选项。

您可以使用
-Wno-[warningname]
格式。任何未明确否定的警告仍会报告。对于您的情况,您可以使用:

-Wall -Wno-integer-division
编辑:注意并非所有编译器都使用
-Wall
(例如,ifort)。这就是说,如果您使用
-Wall
,并且希望避免使用
-Wno整数除法
,那么我不知道有什么方法可以在不使用
real
int
进行正确转换的情况下防止整数除法警告

但是,由于您不希望使用编译器选项,并且觉得额外的类型转换很麻烦,那么只要您可以在
a
不是
参数的情况下生存(即,只是一个普通的
整数
),您就可以编写一个过程来为您执行所有显式转换。例如:

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

因此,使用
intdiv(n,m)
可以减少键入,但结果不是一个参数


如果这是一个协议破坏者,那么考虑将<代码> A<代码>传递到一个带有<代码>意图(IN)< /代码>的子程序。然后,任何更改其值的尝试都会发出错误,因此您会得到相同的行为。

@HighPerformanceMark这是一个简化的示例。问题代码使用其他文件中定义的参数进行更长的计算,这取决于预处理器定义,但在需要截断的地方仍然需要整数除法。我没有此版本的gfortran可供使用,但如果完全有效的代码默认生成警告,则这确实是不可接受的。如果出现精确的整数结果(例如,
n*(n+1)/2
?@agentp这不是默认情况,而是使用了
-Wall
,它会对许多其他有效代码(隐式转换、未使用的变量等)发出警告。我不喜欢的是,似乎没有合理、紧凑的编写代码的方法来避免警告(我不会将
a=int(real(n)/m)
称为“合理”)。但是,是的,例如,如果
n=10
,警告就会消失。我想知道为什么它不给出“可能被截断”(即非常量)的警告结果:如果一个(可能是故意的)被截断的结果值得警告,那么一个可能被截断的结果当然也值得警告。如果有帮助的话,
int(…)
部分是不必要的:它是隐式发生的。@francescalus没有必要的,但是如果没有
int(…)
你会在转换中得到一个“值的变化”“警告/error@Jellby啊,我现在明白了。我做了一次编辑,并提出了一个替代建议。感谢您的尝试,当
a
用于对静态数组进行尺寸标注时,它没有任何帮助。使用Fortran77时代的代码库时,我希望将更改保持在最低限度。好的一面是:它捕获了一个bug(
m+3/2
而不是
(m+3)/2
).Hmm,很公平。我知道重构F77代码可能是一次尝试,可能不值得为避免这些警告消息而付出努力。也就是说,尽管需要进行一些更改,但如果您接受建议,将一些变量(如
a
)传递给子例程,则可以使用它来指定数组维度(不确定这是否是你的意思)。数组可能在公共块中(叹气!)。但实际上,如果我必须创建新过程并更改现有过程的参数,我宁愿编写
a=int(real(m)/n)
;)
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