隐式转换整数<--&燃气轮机;Fortran if语句中的逻辑

隐式转换整数<--&燃气轮机;Fortran if语句中的逻辑,fortran,gfortran,Fortran,Gfortran,我有一些遗留的Fortran代码,我被要求分析并翻译成现代语言。我不知道过去使用哪个编译器来编译代码,所以现在,我尝试用gfortran编译它。代码中包含这样一条语句,导致gfortran抱怨: program test implicit none integer*4 :: var var=.true. if(var) then write(*,*) "Hi" endif end program test 使用gfortran编译此文件时会出现以

我有一些遗留的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语句中没有隐式转换,尽管:

这在GFortran中是不可能的。各国:

但是,在中没有整数值的隐式转换 if语句,或I/O操作中的逻辑值或整数值

您只能在指定中执行隐式转换,例如

  integer :: var
  var = .true.

但即使在那里,你也必须非常小心。它不符合标准,并且值
var
在编译器之间会有所不同。英特尔过去使用
-1
(所有位都设置为1),除非为
.true.
选择了
-standard semantics
,但gfortran使用的
+1
与C语言一样。新版本的“英特尔Fortran”将更改默认设置。另一个方向更为棘手,可能有一些值既不是
.true.
也不是
.false.

我无法回答这个问题(因为我不知道如何让gfortran编译这段坏代码),但你能让
var
符合逻辑吗?是的,这很有效,但我不想改变密码,这是一个完全合理的愿望。不过,有一个警告:如果代码中有这些非标准部分,那么就无法说明编译器没有抱怨的其他情况(这可能会让您感到惊讶)。看看最初使用的编译器可能值得一看。如果你不想将代码更改为Fortran,你怎么能坚持使用Fortran编译器来编译它?Intel将编译此代码。Gfortran:你自己没有找到关于它的手动输入,所以你认为这在Gfortran中是不可能的。我们是否应该复制手册为您提供答案?请注意,还有其他问题
.true。
在gfortran中为+1,但在Intel(12月,康柏)中为-1。Intel在几年前更改了默认值。当前默认值为“var/=0”和“transfer(.TRUE.,0)=1”。旧的默认值实际上是“iand(var,1)/=0”和“transfer(.TRUE,0)=-1”。当您将transfer(2,.FALSE.)馈送到编译器的一些内部表示并选择其中一个或另一个有文档记录的内部表示时,编译器可能仍然存在错误。这个问题是一年前写的。但许多人仍然使用旧版本。当我在这里与史蒂夫·莱昂内尔(Steve Lionel)讨论这种行为时,这已经不是遥远的过去了。它与
逻辑(c_bool)
特别混淆,如果没有
标准语义,它就不能正常工作。这个论坛的一个问题是,很多帖子都是多年前重新出现的,所以如果你忘记检查日期,你就与上下文不一致了。该标准应该建议实现者将C_BOOL设置为-1,因为C没有逻辑类型(_BOOL是一个整数类型),并且试图让Fortran逻辑与C_BOOL匹配意味着Fortran逻辑将与C一样中断。这是错误的!是的,它是一个整数,但使逻辑可互操作仍然是有用的。什么是“那”呢?我错在哪里了?