fortran - 如何避免整数除法警告?

标签 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))

我想继续使用 -Wall(和 -Werror),我宁愿修改代码也不愿为特定文件摆弄编译器选项,特定编译器版本等

最佳答案

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

-Wall -Wno-integer-division

编辑:请注意,-Wall 并非被所有编译器使用(例如,ifort)。也就是说,如果您使用 -Wall,并且想避免使用 -Wno-integer-division,那么我不知道有什么方法可以防止整数除法警告使用 realint 进行正确的转换。

然而,由于您宁愿不使用编译器选项,并且发现额外的类型转换很麻烦,那么只要您可以在 a 不作为 参数 的情况下生活(也就是说,只是一个普通的 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) 的子例程。然后,任何更改其值的尝试都会引发错误,因此您会得到相同的行为。

关于fortran - 如何避免整数除法警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45895020/

相关文章:

parallel-processing - Omp 部分与 Omp 工作共享

string - 通过返回分配的字符串导致内存泄漏

iphone - NSTimer Xcode 警告

gcc - 如何抑制警告 "gets() is deprecated"?

fortran - 如何从 sublime 文本运行 gfortran 代码?

fortran - forrtl : severe (157): Program Exception - access violation

arrays - Fortran中多维数组的线性索引

c - 编译为 cortex-m0 时,unsigned int 不是 uint32_t——可能是 C 编译器标志问题

macos - Fortran : Undefined symbols for architecture x86_64

macros - 使用 Fortran 预处理器连接展开的宏和单词