既存のFORTRANコードを使用しているときに問題が見つかりました。再割り当てする前にアレイの割り当てを解除する必要があると予想されていましたが、これは必要ではありませんでした。これを行うには今必要ですが、正しく機能しません。
現在の擬似コードはおおよそ次のとおりです。
MODULE mA
TYPE A
REAL, DIMENSION(:,:,:), ALLOCATABLE :: array
END TYPE
TYPE (A), POINTER :: sw(:)
END MODULE
後で、「配列」のサイズを割り当てるコードがあります。これは、現在2回(これまでは1回だけ)呼び出しています。
...
IF (ALLOCATED(sw(1)%array)) DEALLOCATE(sw(1)%array, STAT=aviFail)
IF (aviFail.EQ.0) ALLOCATE(sw(1)%array(1,2,3), STAT=aviFail)
...
ALLOCATE、DEALLOCATE、およびALLOCATEDの定義を調べたところ、次のことがわかりました。
- 2回目は、DEALLOCATEが呼び出されますが、STAT値は「1」です。
- 失敗した場合(つまり、正のSTATリターン)、DEALLOCATEは、元の配列をそのままにしておくことを意味します。そうではありません。明らかに正しくクリアされます(少なくともデバッガーによると)。
- 障害が発生し、STATが定義されていない場合、DEALLOCATEはプログラムを終了することを意味します。そうではありませんが、次のALLOCATEステートメントはSTAT値「1」で失敗します。
また、最初にDEALLOCATINGを実行せずに、同じ配列でALLOCATEを他の場所で2回誤って呼び出していました。本によると、これはプログラムの終了につながるはずです。これは機能するだけでなく、正しく機能し、2番目のALLOCATEからのSTATリターンは「0」です。
Intel FORTRANはこれらの処理を異なる方法で処理しますか、それともFORTRANはC ++のように仕様を満たすことに煩わしくないのでしょうか?