2

私が使用しているコードが gcc v. 4.4.6 でビルドすると、配列サイズの不一致が原因で実行されないことがわかり、不愉快な驚きを覚えました。gcc v. 4.7.3 でビルドすると問題なく動作しました。問題の根本を示すために、最小限の実例を作成しました。

program main

   implicit none

   integer, allocatable, dimension(:,:) :: array_a
   integer, allocatable, dimension(:,:) :: array_b

   allocate(array_a(5,2))
   allocate(array_b(2,1))

   array_a = 1 

   array_b = array_a

   print *, array_a
   print *, array_b

end program main

gcc v. 4.4.6 でビルドすると、実行時に次のエラーでクラッシュします。

ファイル main.f90 の 13 行目で Fortran ランタイム エラー: 配列バインドの不一致、配列 'array_b' の次元 1 のサイズの不一致 (1/4)

gcc v. 4.7.3 でビルドすると、次の出力が生成されます。

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

「array_a」のサイズに合わせて「array_b」のサイズが自動的に変更されることに注意してください。これは、私が目にしている新しい Fortran 標準によって提供される「機能」ですか?

4

2 に答える 2

6

Fortran 2003 の機能 (割り当て時の自動配列再割り当て) を使用しています。gcc-4.4 ではまだ実装されていません。

この機能は、以前に不適合な形状に割り当てられた配列 b が、代入の右辺の形状に自動的に再割り当てされることを意味します。Fortran 2003 機能には、(GCC だけでなく) 最新のコンパイラ バージョンを使用する必要があります。

于 2013-10-28T18:54:45.997 に答える
1

Vladimir が言うように、これは Fortran 2003 の機能です。2003 年の作業文書のセクション 7.4.1.3 を見ると、

variableが割り当てられた割り付け可能な変数である場合、exprが異なる形状の配列であるか、またはvariableexprの対応する長さ型パラメーター値のいずれかが異なる場合、割り当てが解除されます。variableが割り当てられていない割り当て可能変数であるか、割り当てられていない変数になる場合、各遅延型パラメーターが expr の対応する型パラメーターに等しく、expr形状があり、各下限が の対応する要素に等しい状態で割り当てられますLBOUND(expr)

array_b注 7.36 は、その形状を維持したい場合は、線を次のように宣言する必要があることを示しています。

array_b(1:2,1) = array_a(3:4,2)

array_aあなたが望むあらゆる要素の。

于 2013-10-28T19:03:56.340 に答える