Фортран, производное назначение типа

Скажем, у меня есть производный тип Фортрана

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.

2 ответа

Решение

В отсутствие подходящей определенной процедуры присвоения, доступной для присвоения одного типа другому, происходит внутреннее присвоение производного типа. Это описано в F2008 7.2.1.3. Для вашего определения типа внутренне присваиваемое производное присваивание в основном делает то, что делает ваша процедура:

  • Нераспределяемые компоненты (которые сами по себе не имеют определенного назначения с привязкой к типу) назначаются через внутреннее назначение. Если они имеют присваивание, связанное с типом, это используется.

  • Выделяемые компоненты в объекте, которому назначается, освобождаются, если они уже распределены, перераспределяются с тем же типом, параметрами типа и границами присваиваемого выражения, а затем для передачи значения используется назначенное присвоение с привязкой к типу (если применимо) или внутреннее присвоение.

Также:

  • компоненты-указатели назначаются через указатель;

  • Компоненты coarray должны совпадать в статусе распределения между переменной и выражением и передаваться с использованием внутреннего присваивания.

Это очень похоже на вопрос, заданный несколько дней назад: вложенный производный тип с перегруженным назначением. Смотрите принятый ответ там для подробного объяснения.

Вы можете использовать свою подпрограмму copy_atype непосредственно, чтобы сформировать assignment оператор:

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

Таким образом, вы можете напрямую присвоить значения одного и того же типа переменной типа atype, Вы могли бы даже расширить присваивание другим типам переменных, указав через запятую список соответствующих подпрограмм.

Другие вопросы по тегам