Производный тип Fortran — общедоступный указатель на закрытый массив

Я пытаюсь определить тип, производный от Fortran, который имеет частный выделяемый массив. Однако я хотел бы иметь доступ к массиву через общедоступный указатель для использования в других модулях. Например.

type,public :: test
private
 real,allocatable :: a(:,:,:)
contains
 real,pointer,dimension(:,:,:),public :: point => a
end type test

Я просто получаю ошибку компилятора при попытке сделать это, как указано выше.

Возможно ли это без написания подпрограммы, которая указывает мне?


person HM13    schedule 09.04.2014    source источник


Ответы (1)


No.

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

Помимо синтаксиса, есть некоторые проблемы с тем, что вы хотите сделать:

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

  • Вы не можете связать указатель с чем-то, что не выделено. Если что-то не выделено, то не на что указывать.

  • Инициализатор для компонента указателя не может ссылаться на что-то, что может быть размещено. В дополнение к целевому атрибуту вещь, на которую он ссылается, должна иметь атрибут SAVE. Как и в случае с атрибутом TARGET, переменные имеют атрибут сохранения, а не определения типа или компонента.

  • Связывание указателя с компонентом объекта может лишить смысла делать компонент закрытым. Это приводит к вопросу - что вы пытаетесь сделать?

person IanH    schedule 09.04.2014
comment
Развернутый ответ, спасибо. У меня есть некоторый код Fortran, который использует массив производных типов как частный и имеет функцию «точка», связанную с типом, указывающим на частный массив. Однако я пытаюсь использовать директивы OpenACC в других частях программы, и они не работают с подпрограммой указателя, поэтому я пытался найти обходной путь. Я постараюсь оставить указатель нулевым и указать его после того, как массив будет выделен, еще раз спасибо за ваш ответ! - person HM13; 09.04.2014
comment
Вы можете установить его так, чтобы он указывал в нужном месте в конструкторе типа. - person Vladimir F; 09.04.2014
comment
Для ясности... конструкторы структур в Fortran выглядят как функции (в отсутствие каких-либо спецификаций параметров типа). Предоставляемые пользователем конструкторы, которые следуют этому шаблону и реализованы как функции (возможно, скрывая настоящий конструктор структуры), практически не могут использоваться для связи указателя одного компонента с другим компонентом - указатель связывается с чем-то, что перестанет существовать вскоре после функции. возвращается. Вы должны построить с помощью подпрограммы. Помните о множестве способов, которыми статус ассоциации указателя может впоследствии стать неопределенным. - person IanH; 10.04.2014