Указатель или выделяемый для компонентов типа - PullRequest
0 голосов
/ 16 января 2019

Скажем, у вас есть объявленный тип dat1, который имеет количество членов по умолчанию. В зависимости от времени выполнения это dat1 может расширяться или не расширяться другими типами. Это легко, так как вы можете использовать функцию extends. Однако, если у вас есть массив dat1 и некоторые элементы этого массива могут хотеть или не хотеть наследовать другой тип - как это сделать наиболее разумно.

У меня есть следующий пример:

type dat1 

  real :: x(3)
  type(dat2), allocatable :: rnd 
  type(dat1), pointer :: next => dat1
end dat1

Теперь я использовал связанный список для этого. Мой вопрос в основном, если это правильный способ объявить второй тип rnd как выделяемый, а затем просто выделить его всякий раз, когда узел запрашивает его. Другой вариант - объявить его как указатель, т. Е. type(dat2), allocatable :: rnd, теперь есть какие-либо существенные различия, несмотря на общие различия Фортрана с указателями по сравнению с присваиваемыми значениями, такими как явное / неявное освобождение, непрерывная память и т. Д.

Обратите внимание, что независимо от того, что к каждому узлу dat1 всегда будет присоединен тип 0 или 1 rnd.
Я думал во время выполнения, что я проверю, был ли выделен rnd или для указателя это будет связано.

1 Ответ

0 голосов
/ 16 января 2019

Компоненты производного типа имеют те же проблемы , что и общие указатели / назначаемые переменные .

Тем не менее, есть дополнительные аспекты, представляющие интерес для компонентов:

  • автоматическое освобождение : при освобождении объекта производного типа все выделенные выделяемые компоненты освобождаются; компоненты указателя не освобождаются и не отсоединяются автоматически.

  • ссылки на тип : и указатель, и размещаемые компоненты могут относиться к определенному типу (здесь dat1) или определяться позднее, но для выделяемых компонентов эта функция недоступна до Fortran 2008 и массово не поддерживается компиляторами.

Одно различие, не упомянутое в ответе на связанный вопрос, относится к этому вопросу. Вот вы говорите:

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

Всегда разрешается запрашивать ALLOCATED(x%rnd) (выделяемый), но не всегда разрешается запрашивать ASSOCIATED(x%rnd) (указатель). Компонент указателя может иметь неопределенный статус ассоциации, тогда как назначаемый компонент всегда будет иметь определенный статус распределения. 1

Поэтому вы можете захотеть установить начальный статус ассоциации компонента-указателя.


1 Случай неопределенного статуса распределения (Fortran 90) и выделяемых компонентов никогда не существовал в стандарте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...