10

Fortran (90) で (実際の) 配列のディープ コピーが必要ですが、参照がどのように機能するかを完全には理解していないため、配列を取得する方法が正確にはわかりません。直感的に、私はこれが私が望むものを手に入れることを期待しています:

do i=1,n
  b(i) = a(i)
end do

b(1:n) = a(1:n)ただし、最近、上記のコードと同等であることが指摘されました。直感的には、 の参照がメモリ内の の場所を指しているb(1:n) = a(1:n)だけだと思います。b(1:n)a(1:n)

b(1:n) = a(1:n)ディープコピーですか?なんで?とは対照的に、基になる参照で何が起こっていb = aますか?

4

2 に答える 2

16

do配列、ループ、b(1:n) = a(1:n)およびをコピーするために言及した3つの方法b = aはすべて同等です。a配列の内容を配列にコピーしますbabは単純な配列であり、派手なポインターなどではないため、割り当てa = bは基本的に数式と同じです。参照が行われている場合 (ユーザーが知っておく必要があること) はありません。これが、Fortran が学習するのに非常に簡単な言語である理由です。Fortran ではポインター配列を使用できますが、これはまったく別の問題です。

M Metcalf と J Reid のFortran 90/95 の説明は、Fortran 言語の機能に関する参考資料として常に役立ちます。48ページから:

3.11 配列代入

組み込み代入により、配列式を同じ形状の配列変数に代入できます。これは、式の各要素が変数の対応する要素に代入されたかのように解釈されます。たとえば、宣言を使用して

real, dimension(10, 20) :: a

割り当て

a = a  + 1.0

forと にa(i,j)置き換えます。a(i,j) + 1.0i=1,2..,10j=1,2,..,20

また、スカラー式を配列に割り当てることができることに注意してください。この場合、saclar 値はすべての配列要素にブロードキャストされます

これが実際にどのように実装されているかという点では、これはあなたの質問で推進していると思いますが、これは Fortran 標準では完全に指定されていません。この種のことは未指定のままにして、コンパイラの作成者が好きなように最適化を行うことができるようにします。たとえば、割り当てa = bでは、 の要素bがコピーされる順序aは標準で指定されていないため、さまざまなコンパイラがさまざまな方法でこれを行うことができます。この質問について知っておく必要があるのは、提供されたabはポインターではなく、abは別個の配列であり、一方の要素を変更しても他方の対応する要素は変更されないということだけです。センスなので、a=bbは「ディープ コピー」であり、すべてのアイテムを のメモリ ロケーションにコピーすると考えることができますa

于 2012-08-03T16:56:38.397 に答える
10

a = b は、配列 b 全体を a にコピーします。n より大きい次元の配列の一部のみが必要な場合は、添字表記 a(1:n) = b(1:n) を使用できます。それは Fortran 90 です。これは FORTRAN 77 よりも高水準の言語です。「a = b」はコピーであり、ポインター a をターゲット b に関連付けていないことがわかります。これは、そのステートメントで演算子「=」が使用されているためです。ポインターの関連付けは => を使用します。

編集:コピーすると、おそらくdoループと同じマシンコードで複製が作成されます。ポインターの関連付けは、すべての配列要素を複製する do ループを実行せずに参照を作成します。

http://en.wikipedia.org/wiki/Fortran_95_language_featuresを参照してください

于 2012-08-03T16:55:08.413 に答える