Fortran if 语句中的隐式转换整数 <--> 逻辑
Implicit conversion integer <--> logical in Fortran if statement
我有一些遗留的 Fortran 代码,我被要求分析并翻译成现代语言。我不知道过去使用哪个编译器来编译代码,所以现在,我正在尝试用 gfortran 编译它。该代码包含这样的语句导致 gfortran 抱怨:
program test
implicit none
integer*4 :: var
var=.true.
if(var) then
write(*,*) "Hi"
endif
end program test
用 gfortran 编译它会出现以下错误:
test.f:6:9:
if(var) then
1
Error: IF clause at (1) requires a scalar LOGICAL expression
(此外,它对在 var=.true.
中完成的转换发出警告)。
我不确定代码是哪个编译器编译的,但显然代码应该按原样编译。有没有办法告诉 gfortran 接受这个转换?
根据文档,虽然在 if 语句中没有进行隐式转换:https://gcc.gnu.org/onlinedocs/gfortran/Implicitly-convert-LOGICAL-and-INTEGER-values.html
这在 GFortran 中是不可能的。 manual 状态:
However, there is no implicit conversion of INTEGER values in
if-statements, nor of LOGICAL or INTEGER values in I/O operations.
你只能在像你的
这样的赋值中执行隐式转换
integer :: var
var = .true.
但即使在那里你也必须非常小心。它不符合标准,值 var
会因编译器而异。 Intel 曾经使用 -1
(所有位设置为 1),除非选择了 -standard-semantics
,对于 .true.
,但是 gfortran 使用 +1
,就像在 C 语言中一样。新版本的 Intel Fortran 更改了默认值。另一个方向甚至更棘手,可能存在既不是 .true.
也不是 .false.
.
的值
我有一些遗留的 Fortran 代码,我被要求分析并翻译成现代语言。我不知道过去使用哪个编译器来编译代码,所以现在,我正在尝试用 gfortran 编译它。该代码包含这样的语句导致 gfortran 抱怨:
program test
implicit none
integer*4 :: var
var=.true.
if(var) then
write(*,*) "Hi"
endif
end program test
用 gfortran 编译它会出现以下错误:
test.f:6:9:
if(var) then
1
Error: IF clause at (1) requires a scalar LOGICAL expression
(此外,它对在 var=.true.
中完成的转换发出警告)。
我不确定代码是哪个编译器编译的,但显然代码应该按原样编译。有没有办法告诉 gfortran 接受这个转换?
根据文档,虽然在 if 语句中没有进行隐式转换:https://gcc.gnu.org/onlinedocs/gfortran/Implicitly-convert-LOGICAL-and-INTEGER-values.html
这在 GFortran 中是不可能的。 manual 状态:
However, there is no implicit conversion of INTEGER values in if-statements, nor of LOGICAL or INTEGER values in I/O operations.
你只能在像你的
这样的赋值中执行隐式转换 integer :: var
var = .true.
但即使在那里你也必须非常小心。它不符合标准,值 var
会因编译器而异。 Intel 曾经使用 -1
(所有位设置为 1),除非选择了 -standard-semantics
,对于 .true.
,但是 gfortran 使用 +1
,就像在 C 语言中一样。新版本的 Intel Fortran 更改了默认值。另一个方向甚至更棘手,可能存在既不是 .true.
也不是 .false.
.