我在Visual Studio 2012中使用英特尔Fortran编译Fortran代码。 当我尝试使用逻辑运算符时,我注意到一个独立的逻辑表达式会产生预期的T或F.但是,如果我需要数字T或F(0或1),当逻辑结果为T时,我得到-1。
例如:
integer*4 a
a = 1
logicval = (node(5,L).gt.0)
numval = 1*(node(5,L).gt.0)
write(*,*) logicval, numval
会输出
T,-1
有没有办法可以重新定义分配给T& T的数值。 F'
答案 0 :(得分:4)
正如其他人所说,英特尔Fortran对此非标准用法的默认设置是低位设置(奇数)的整数值为真,偶数值(低位清除)为假。常量.TRUE。位模式为-1。在进行转换时会变得更复杂,直到版本17,编译器在这方面还没有完全一致。请注意,如果使用-standard-semantics,则隐含-fpscomp逻辑。
请阅读https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/275071#comment-1548435以及版本17发行说明(https://software.intel.com/en-us/articles/intel-fortran-compiler-170-release-notes),了解有关如何处理数字逻辑转换的版本变更信息。
答案 1 :(得分:2)
是的,预计英特尔Fortran的TRUE确实为-1,因为所有位都设置为1。
此外,将整数用作逻辑(布尔)变量是完全不标准的。您应该将代码延长几行并始终进行适当的转换。 Fortran中不允许使用integer_var = 1*(node(5,L).gt.0)
,许多编译器将拒绝。如果您放弃1*
gfortran将发出警告,但您的表单会导致错误。
您可以简单地以符合标准的方式转换逻辑和整数
if (l) then
x = 1
else
x = 0
end if
您可以使用MERGE()
intrisic或使用WHERE
轻松地将Fortran逻辑数组转换为1和0的整数数组。
-fpscomp logicals
,它将LOGICAL
类型的处理切换为将零非零视为真,并使.true.
常量等于整数1。
仍然要小心,因为它不会使你的程序可移植,它只是在一个特定的编译器中解决一个可移植性问题。
您可以使用C互操作逻辑类将定义与英特尔C表示相匹配:
use iso_c_binding
logical(c_bool) :: variable
这些值将为+1和0,因为C99指示_Bool。如果您需要它们与int
互操作,则必须进行一些简单的转换。 C_int
与c_bool
不兼容。
根据英特尔编译器的版本,您可能需要使用-standard-semantics
(或-fpscomp logicals
)来表示正确的logical(c_bool)
。我认为这是非常不幸。