Только действительные экземпляры переменных или производных типов могут иметь атрибут TARGET
.Таким образом, выделяемое во втором определении типа не может быть целью, так как это просто описание того, как должен выглядеть тип, если вам нравится шаблон.
Однако вы можете дать реальный экземпляр типаатрибут TARGET
, а затем указать на любую из его составных частей с соответствующим образом объявленными указателями Фортрана.
Отредактировано : альтернатива и, вероятно, больше того, что вам нужно, это датьвекторный массив только с атрибутом POINTER
, что неявно делает его законным и может использоваться для выделения памяти.Вам просто нужно убедиться, что вы не переназначаете указатель (v
в примере ниже) после того, как используете его для выделения памяти, потому что тогда у вас будет утечка.
PROGRAM so_pointtype
IMPLICIT NONE
TYPE vec
INTEGER :: x = 2, y = 3
END TYPE vec
TYPE foo
TYPE(vec),POINTER :: v(:)
END TYPE foo
TYPE(foo) :: z
TYPE(vec),DIMENSION(:),POINTER :: p2 => NULL()
ALLOCATE(z%v(3))
PRINT*,z%v(:)
p2 => z%v(:)
PRINT*,p2
END PROGRAM so_pointtype