2011-01-18 11 views
12

なぜFortran 90 Specificationは、TARGETキーワードを使用してPOINTERを関連付ける必要がある(5.2.8)のはなぜですか?なぜすべてのタイプが有効なターゲットではないのですか?なぜFortran POINTERはTARGETを必要としますか?

例えば、

 
INTEGER, POINTER :: px 
INTEGER, TARGET :: x 
x = 5 
px => x 
有効な構文ですが、
 
INTEGER, POINTER :: px 
INTEGER :: x 
x = 5 
px => x 
無効です。

なぜこれが必要ですか?

答えて

15

ポイントされる可能性のあるアイテムは、別のアイテムに別名を付けることができ、コンパイラはこれを許可する必要があります。ターゲット属性のない項目にはエイリアスを付けるべきではなく、コンパイラはこれに基づいて前提条件を設定し、より効率的なコードを生成することができます。

+0

私の前のコメントは正確ではありませんでした。ポインタ/ターゲットの関連付けは、本当にトリッキーな状況につながります。あなたがFortranでポインタ/ターゲット関連の慣行を経験していない場合は、さらに読むことをお勧めします。たとえば、このリンクを参照してください。https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/709550 –

2

Fortranのポインターは、cのポインターとは異なります。 fortranでは、90のポインタは、ターゲットを持つような制限がほとんどありませんでした。これは速度の問題に対処し、ポインタの使用を安全に保つために行われました。 1つの呼び出しでは、ターゲットを指定する必要のない割り当て可能なポインタが作成されます。もっと深く掘り下げてみてください!

0

コンパイラ最適化のために。コードが1K〜100Kのコアで実行されている場合、速度は重要です。

Btw TARGETは必ずしも使用されません。例えば、ポインターがメモリーの割り当てに使用されている状況。

... 
real, pointer :: p(:), x 
... 
allocate(p(15)) 
... 
x => p(1:5) 
... 
nullify(x) 
deallocate(p) 
... 
+0

コンパイラによっては、これを行うには、(x(5))を割り当てる必要があります。 – AlanSE

+0

@AlanSeどのコンパイラでお願いしますか?示された線のセットは正しいようです。 –

+2

@ user49734ポインタは常に「ターゲットテーブル」であるため、TARGETはここでは必要ありません(さらには禁止されていません) –

関連する問題