3

我有一个在 gfortran 中编译的 fortran 代码(几千行,所以我会尝试发布重要的行),它给了我:

nrev(isat)=dint((t_ref-t_in)/zper)+1
           1
Warning:Possible change of value in conversion from REAL(8) to INTEGER(4) at (1)

它们被初始化为:

integer*4  nrev(nmaxsat)
integer*4  isat
real*8     t_ref
real*8     t_in
real*8     zper

有想法该怎么解决这个吗?谢谢!

4

1 回答 1

4

摆脱所有警告,即使是次要的警告是一个绝妙的主意——即使只是这样当你确实遇到更重要的问题时,你会看到它们,而不是让输出被小事淹没。

在这种情况下,警告信息相当清楚;您正在为整数分配双精度。内在截断,dint但它不转换类型;所以你要分配一个双精度值,它的值被截断为整数。您可以正确地注意到内在函数的名称令人困惑,但是...

如果要进行转换以及截断,则idint实际上转换为整数。

所以例如这个程序

program foo

    integer :: nrev
    double precision :: t_ref

    t_ref  = 1.

    nrev = dint(t_ref)

end program foo

创建相同的警告:

$ gfortran -o foo foo.f90 -Wall -std=f95
foo.f90:8.11:

    nrev = dint(t_ref)
           1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1)

但是这个很好:

program foo

    integer :: nrev
    double precision :: t_ref

    t_ref  = 1.

    nrev = idint(t_ref)

end program foo

如我们所见:

$ gfortran -o foo foo.f90 -Wall -std=f95
$ 
于 2012-04-09T18:49:05.620 回答