15

Fortran 派生型があるとします。

type :: atype
    integer :: n
    integer :: a(10)
    integer, allocatable :: b(:)
 end type

このタイプのインスタンスが2つあります

type(atype) :: t1, t2

次の割り当てを行うと、正確にはどうなりますか?

t2 = t1

派生型変数の意味のコピーを正しく作成したいので、これに興味があります。スカラー コンポーネントは等しくなければならず、配列コンポーネントの各要素は等しくなければならず、割付け可能な配列は同じ割り当てサイズを持ち、要素は等しくなければなりません。現時点では、コンポーネントを正しくコピーして割り当てるサブルーチンを作成するだけです。

subroutine copy_atype(from, to)
    type(atype) :: from, to
    to%n = from%n
    to%a = from%a
    if (allocated(to%b)) deallocate(to%b)
    if (allocated(from%b) then
        allocate(to%b(size(from%b)))
        to%b = from%b
    end if
end subroutine

標準の適切なセクションへの指示をいただければ幸いです。

gfortran 4.7 を使用しています。

4

2 に答える 2

15

あるatype を別の atype に割り当てるためにアクセスできる適切な定義済みの割り当て手順がない場合、組み込みの派生型の割り当てが発生しますこれについては、F2008 7.2.1.3 で説明されています。型定義の場合、組み込みの派生型の割り当ては、基本的にプロシージャが行うことを行います。

  • 割り当て不可能なコンポーネント (それ自体にはタイプ バインド定義された割り当てがない) は、組み込みの割り当てを使用して割り当てられます。タイプ バインド割り当てがある場合は、それが使用されます。

  • 割り当て先のオブジェクト内の割り当て可能なコンポーネントは、既に割り当てられている場合は割り当てが解除され、同じ型、型パラメーター、および割り当てられている式の境界で再割り当てされます。その後、型バインド定義割り当て (該当する場合) または組み込み割り当てを使用して値が転送されます。

また:

  • ポインター コンポーネントは、全体に割り当てられたポインターです。

  • coarray コンポーネントは、変数と式の間の割り当て状態が一致している必要があり、組み込み代入を使用して転送されます。

于 2013-10-01T11:05:51.640 に答える