2013-10-01 79 views
12

說我有一個Fortran派生類型Fortran派生類型分配

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

,我有這種類型的

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。

回答

11

缺席可以訪問一個合適的已定義的分配過程,以便將一個atype分配給另一atype,就會發生固有的派生類型分配。這在F2008 7.2.1.3中有描述。爲了您的類型定義,本質派生類型分配基本上沒有你的程序做什麼:

  • 非分配組件(即本身並不具有約束類型定義分配)跨使用內部賦值分配。如果它們具有類型綁定分配,則使用該分配。

  • 如果已分配對象,則分配的對象中的可分配組件被重新分配,使用相同類型,類型參數和要分配的表達式的邊界重新分配,然後鍵入綁定定義的分配(如果適用)或使用內在分配轉移價值。

另外:

  • 指針組件指針橫跨分配;

  • coarray組件必須匹配變量和表達式之間的分配狀態,並使用內在賦值進行傳輸。

1

這是非常相似的一個問題問了幾天就回來:Nested derived type with overloaded assignment。詳細解釋請參閱接受的答案。

你可以用你的子程序copy_atype直接形成assignment操作:

type :: atype 
    integer :: n 
    integer :: a(10) 
    integer, allocatable :: b(:) 
contains 
    procedure :: copy_atype 
    generic :: assignment(=) => copy_atype 
end type 

這種方式,您可以直接分配相同類型的值atype類型的變量。你甚至可以通過提供一個逗號分隔的適當的子程序列表擴展分配給其他類型的變量。

+0

好知道,但不正是我一直在尋找。 – stiaan