Gfortran 警告:从 REAL(8) 到 INTEGER(4) 的转换值发生变化!
Gfortran warning: change of value in conversion from REAL(8) to INTEGER(4)!
我使用的是旧的 Fortran 脚本(可访问 here)。我收到以下警告(第 192 行、233-235 行)。有办法解决吗?我在 mac.
上使用 gfortran 6
Ms-MacBook-Pro-2:~ Tonoy$ gfortran -g -fcheck=all -Wall mrtm.f
mrtm.f:192:8:
N=COL/DX
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion]
mrtm.f:233:10:
NKK=TPRINT/DT+0.50D0
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion]
mrtm.f:234:10:
KLM=TTOTAL/DT+0.50D0
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion]
mrtm.f:235:9:
KK=KLM/NKK+0.5D0
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion]
看起来变量 N、NKK、KLM 和 KK 都被隐式声明为整数。但是,作业的右侧包括明确为 REAL*8 的数字。所以基本上发生的事情是编译器正在将每一行的右侧评估为 REAL*8,但随后尝试将结果值分配给整数。如果小数点后有任何非零数字,它们将在 conversion/assignment.
中丢失
在赋值中,编译器将简单地忽略小数点及其后的任何数字。在许多旧的 Fortran 代码中,这是预期的行为,因此代码正在执行其预期的操作。
如果你只是想摆脱编译警告,你可以用一个 INT 封装右边的赋值,即
N=INT(COL/DX)
NKK=INT(TPRINT/DT+0.50D0)
KLM=INT(TTOTAL/DT+0.50D0)
KK=INT(KLM/NKK+0.5D0)
我使用的是旧的 Fortran 脚本(可访问 here)。我收到以下警告(第 192 行、233-235 行)。有办法解决吗?我在 mac.
上使用 gfortran 6Ms-MacBook-Pro-2:~ Tonoy$ gfortran -g -fcheck=all -Wall mrtm.f
mrtm.f:192:8:
N=COL/DX
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion]
mrtm.f:233:10:
NKK=TPRINT/DT+0.50D0
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion]
mrtm.f:234:10:
KLM=TTOTAL/DT+0.50D0
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion]
mrtm.f:235:9:
KK=KLM/NKK+0.5D0
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) [-Wconversion]
看起来变量 N、NKK、KLM 和 KK 都被隐式声明为整数。但是,作业的右侧包括明确为 REAL*8 的数字。所以基本上发生的事情是编译器正在将每一行的右侧评估为 REAL*8,但随后尝试将结果值分配给整数。如果小数点后有任何非零数字,它们将在 conversion/assignment.
中丢失在赋值中,编译器将简单地忽略小数点及其后的任何数字。在许多旧的 Fortran 代码中,这是预期的行为,因此代码正在执行其预期的操作。
如果你只是想摆脱编译警告,你可以用一个 INT 封装右边的赋值,即
N=INT(COL/DX)
NKK=INT(TPRINT/DT+0.50D0)
KLM=INT(TTOTAL/DT+0.50D0)
KK=INT(KLM/NKK+0.5D0)