Фортран, производное назначение типа
Скажем, у меня есть производный тип Фортрана
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
, Вы могли бы даже расширить присваивание другим типам переменных, указав через запятую список соответствующих подпрограмм.