2

私が通常使用する ifort コンパイラではなく、gfortran コンパイラでプログラムをコンパイルするように、いくつかのコードを書き直しています。コードは次のとおりです。

_Subroutine SlideBits (WORD, BITS, ADDR) 

Implicit None  
Integer(4) WORD  
Integer(4) BITS  
Integer(4) ADDR  
Integer(4) ADDR1 

ADDR1 = 32 - ADDR  
WORD = (WORD .And. (.Not.ISHFT(1,ADDR1))) .Or. ISHFT(BITS,ADDR1)  

End_ 

gfortran コンパイラを使用して上記のコードをコンパイルすると、次のエラーが表示されます。

WORD = (WORD .And. (.Not.ISHFT(1,ADDR1))) .Or. ISHFT(BITS,ADDR1) 

Error: Operand of .NOT. operator at (1) is INTEGER(4)  

サブルーチンに入る 3 つの変数はすべて整数です。少し調べてみたところ、gfortran wiki には、gfortran コンパイラが整数値に適用される論理ステートメントを処理できるはずであると記載されています。私が訪れた他のいくつかのサイトは、gnu wiki から引用しているか、それに同意しています。私が通常使用しているインテル Fortran コンパイラー (ifort) が正常にコンパイルされるため、このエラーを初めて見ました。

4

3 に答える 3

2

論理/ブール演算子を整数変数に適用することは、標準の Fortran ではありません。目標がブール値の結果である場合、理想的な解決策は型を論理型に変換することです。ざっと見てみるとわかるように、コードが実際にビット単位の操作を行っている場合は、IAND および IOR 組み込み関数を使用することをお勧めします。

于 2011-01-06T22:50:40.103 に答える
1

gfortranは論理演算子のブール値を期待しており、コードは整数を提供しています。論理演算子の代わりにゼロとの比較を使用してください。

WORD = ((WORD /= 0) .And. (ISHFT(1,ADDR1) == 0)) .Or. (ISHFT(BITS,ADDR1) /= 0)

gfortranとifortは、.true..false.値に異なる表現を使用するため、コードで必要な場合はブール値に固執するのが最善です。ifortからgfortranへの変換で、前者は.true.-1として表され、後者は従来の(Cのような)代わりに同じ目的で1を使用することに少し気づきましたnot 0

于 2011-01-06T22:26:28.680 に答える