Количество компонентов должно быть известно во время компиляции, чтобы у вас не было дополнительного компонента.Тем не менее, вы можете иметь выделяемый компонент.В вашем случае:
type :: species
...
character(len=:), allocatable :: fname_new
end type
Другой подход заключается в построении некоторой иерархии классов.Это будет иметь преимущество при кодировании информации в типах, а не в строках.
Редактировать: Как отметил @VladimirF, этот подход требует Фортран-2003.
Реально, если компонент fname_new
действительно имеет длину только 20 символов, вы не сэкономите много места, сделав его распределенным.В архитектуре x86 / 64-битной, выделяемым будет 8-байтовый указатель, который вынудит ваш тип выравнивания, которое будет потреблять еще несколько байтов.Я мог бы просто оставить это как character(len=20)
.