将复杂条件从 C 语言转换为 Fortran
Convert a complicated condition from C to Fortran
我有一个小的 C 函数来转换 Fortran
baralign(n, b) {
return ((n&~(~0<<b)) ? (n&(~0<<b))+(1<<b):(n))
}
我把上面语句中的条件用 Fortran 写成如下
if (IAND(n,NOT(ISHFT(NOT(0),b))))
我不确定这种情况。当我 运行 这段代码时,它会出错说
IF clause requires a scalar LOGICAL expression.
该问题与问题 有关,但该问题略有不同,因为那里的提问者知道问题的性质。
不能像在 C 中那样将整数表达式放入 Fortran 中的 if 条件中
integer :: n, b
if (IAND(n,NOT(ISHFT(NOT(0),b))))
不可能。条件必须是 logical
表达式。
如果整数表达式的任何非零值都应该为真,那么您必须在那里进行整数比较
if (IAND(n,NOT(ISHFT(NOT(0),b))) /= 0) then
如果您要求表达式正好为 1,则可以使用 == 1
。
其余的可能是
baralign = IAND(n,ISHFT(NOT(0),b)) + ISHFT(1, b)
else
baralign = n
end if
但是我不知道代码的用途所以不能确定。
我有一个小的 C 函数来转换 Fortran
baralign(n, b) {
return ((n&~(~0<<b)) ? (n&(~0<<b))+(1<<b):(n))
}
我把上面语句中的条件用 Fortran 写成如下
if (IAND(n,NOT(ISHFT(NOT(0),b))))
我不确定这种情况。当我 运行 这段代码时,它会出错说
IF clause requires a scalar LOGICAL expression.
该问题与问题
不能像在 C 中那样将整数表达式放入 Fortran 中的 if 条件中
integer :: n, b
if (IAND(n,NOT(ISHFT(NOT(0),b))))
不可能。条件必须是 logical
表达式。
如果整数表达式的任何非零值都应该为真,那么您必须在那里进行整数比较
if (IAND(n,NOT(ISHFT(NOT(0),b))) /= 0) then
如果您要求表达式正好为 1,则可以使用 == 1
。
其余的可能是
baralign = IAND(n,ISHFT(NOT(0),b)) + ISHFT(1, b)
else
baralign = n
end if
但是我不知道代码的用途所以不能确定。