我有一些遗留的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
答案 0 :(得分:0)
这在GFortran中是不可能的。 manual州:
但是,没有隐式转换INTEGER值 if-statements,I / O操作中的LOGICAL或INTEGER值。
您只能在
等作业中执行隐式转换 integer :: var
var = .true.
但即便如此,你必须非常小心。它不符合标准,编译器之间的值var
会有所不同。英特尔过去常常使用-1
(所有位设置为1),除非为-standard-semantics
选择.true.
,但gfortran使用{C语言中的+1
。新版本的英特尔Fortran更改了默认设置。另一个方向甚至更棘手,可能有值.true.
和.false.
。