Фортран, производный тип с необязательными компонентами - PullRequest
0 голосов
/ 26 апреля 2018

Правильно ли иметь дополнительный компонент в производном типе.Например, переменная 'fname_new' в фрагменте кода ниже.Если нет, то какой путь?Я хочу включить 'fname_new', в зависимости от того, имеет ли источник тип 1 или 2.

TYPE, PUBLIC :: species
  CHARACTER(LEN=12) :: spname
  CHARACTER(LEN=12) :: source
  CHARACTER(LEN=20) :: fname
  CHARACTER(LEN=12) :: field
  CHARACTER(LEN=20),OPTIONAL :: fname_new
END TYPE species

1 Ответ

0 голосов
/ 26 апреля 2018

Количество компонентов должно быть известно во время компиляции, чтобы у вас не было дополнительного компонента.Тем не менее, вы можете иметь выделяемый компонент.В вашем случае:

type :: species
  ...
  character(len=:), allocatable :: fname_new
end type

Другой подход заключается в построении некоторой иерархии классов.Это будет иметь преимущество при кодировании информации в типах, а не в строках.

Редактировать: Как отметил @VladimirF, этот подход требует Фортран-2003.

Реально, если компонент fname_new действительно имеет длину только 20 символов, вы не сэкономите много места, сделав его распределенным.В архитектуре x86 / 64-битной, выделяемым будет 8-байтовый указатель, который вынудит ваш тип выравнивания, которое будет потреблять еще несколько байтов.Я мог бы просто оставить это как character(len=20).

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