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

小さなものも含め、すべての警告を取り除くことは素晴らしい考えです。たとえ、より重大な問題が発生したときに、出力がささいなことで圧倒されるのではなく、それらを見ることができるとしてもです。

この場合、警告メッセージはかなり明確です。double を整数に割り当てています。組み込みは切り捨てます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 に答える