2013-10-01 18 views
12

Nói rằng tôi có một Fortran có nguồn gốc loạiFortran loại có nguồn gốc phân

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

và tôi có hai trường hợp thuộc loại này

type(atype) :: t1, t2 

chính xác những gì sẽ xảy ra khi tôi làm nhiệm vụ sau đây?

t2 = t1 

Tôi quan tâm đến điều này bởi vì tôi muốn thực hiện một cách chính xác các bản sao của biến loại có nguồn gốc có nghĩa là, các thành phần vô hướng nên được bình đẳng, mỗi yếu tố của các thành phần mảng cần được bình đẳng và mảng allocatable nên có kích thước phân bổ cùng và các phần tử phải bằng nhau. Tại thời điểm này tôi sẽ chỉ viết một chương trình con sao chép và phân bổ các thành phần một cách chính xác.

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 

Tôi sẽ đánh giá cao chỉ đường cho các phần phù hợp trong tiêu chuẩn.

Tôi đang sử dụng gfortran 4.7.

Trả lời

11

Trong trường hợp vắng mặt của quy trình gán được xác định phù hợp có thể truy cập để gán một loại này cho một phép gán kiểu gốc có nguồn gốc khác. Điều này được mô tả trong F2008 7.2.1.3. Đối với định nghĩa kiểu của bạn, bên trong phân loại có nguồn gốc cơ bản những gì thủ tục của bạn không:

  • Các thành phần phi allocatable (mà không tự có loại ràng buộc phân định nghĩa) được giao nhiệm vụ qua sử dụng phân nội tại. Nếu họ có phân công ràng buộc loại, được sử dụng.

  • Các thành phần có thể phân bổ trong đối tượng được gán sẽ được phân bổ nếu đã được phân bổ, phân bổ lại cùng loại, loại tham số và giới hạn của biểu thức đang được gán, sau đó nhập nhiệm vụ được xác định ràng buộc (nếu có). để chuyển giá trị.

Ngoài ra:

  • thành phần con trỏ đang trỏ giao qua;

  • thành phần coarray phải khớp với trạng thái phân bổ giữa biến và biểu thức và được chuyển bằng cách sử dụng gán nội tại.

1

Điều này rất giống với câu hỏi được yêu cầu vài ngày trở lại: Nested derived type with overloaded assignment. Xem câu trả lời được chấp nhận ở đó để có giải thích chi tiết.

Bạn có thể sử dụng chương trình con bạn copy_atype trực tiếp để tạo thành một assignment điều hành:

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

Bằng cách này, bạn có thể trực tiếp gán giá trị cùng loại vào một biến kiểu atype. Bạn thậm chí có thể mở rộng việc gán cho các kiểu biến khác bằng cách đưa ra một danh sách các trình con thích hợp được phân cách bằng dấu phẩy.

+0

Điều cần biết, mặc dù không chính xác những gì tôi đang tìm kiếm. – stiaan

Các vấn đề liên quan