Могу ли я иметь указатель на элемент в размещаемом компоненте массива? - PullRequest
4 голосов
/ 16 октября 2010

У меня есть определенный пользователем тип vector. В другом типе у меня есть размещаемый массив векторов. Я хочу иметь указатель на один вектор из этого размещаемого массива. Поэтому я подумал, что сделаю это:

type another_type
  type(vector),allocatable,target::my_vectors(:)
end type

и

type(vector),pointer::pointed_vec

Но когда я компилирую, компилятор жалуется, что:

This attribute specification is not valid for a component definition statement.

Могу ли я иметь указатель на один элемент из выделяемого массива? Возможно ли это?

Ответы [ 2 ]

5 голосов
/ 18 октября 2010

Только действительные экземпляры переменных или производных типов могут иметь атрибут 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
0 голосов
/ 16 октября 2010

Да, вы можете указать на один элемент в выделяемом массиве, но ваш массив my_vectors является скаляром, который не может иметь атрибут allocatable. Может быть, именно это объявление дает ошибку компилятора. С gfortran я получаю сообщение во время компиляции:

  TYPE(vector),ALLOCATABLE,TARGET :: my_vectors
                                1
Error: Scalar object 'my_vectors' at (1) may not be ALLOCATABLE

Попробуйте объявить my_vectors(:).

...