Fortran 2003, передача производного типа в аргумент родительского типа

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

Мой вопрос прост. Может ли в Фортране функция, ожидающая аргумента типа class(parent), принять вместо class(derived_from_parent)?

Если нужен пример или разъяснение, пожалуйста, спросите. Большое спасибо.


person Mackie Messer    schedule 07.03.2014    source источник


Ответы (1)


Да, это работает без каких-либо проблем. Если вам нужно использовать какое-либо свойство расширенного (производного) типа, вы должны использовать select type, но если нет, то это без каких-либо осложнений.

Если вам нужно, чтобы фиктивный аргумент был allocatable или pointer, есть некоторые ограничения:

12.5.2.5

2 Фактический аргумент должен быть полиморфным тогда и только тогда, когда связанный с ним фиктивный аргумент является полиморфным, и либо фактический, либо фиктивный аргументы должны быть неограниченно полиморфными, либо объявленный тип фактического аргумента должен совпадать с объявленным типом фиктивного аргумента. аргумент.

(причина этого объясняется в ПРИМЕЧАНИЕ 12.27 в ISO/IEC 1539-1:2010)

person Vladimir F    schedule 07.03.2014
comment
Стоит отметить, что существуют исключения для фиктивных аргументов с атрибутом allocatable или pointer. - person IanH; 08.03.2014
comment
@VladimirF @IanH Итак, является ли подходящим синтаксисом то, что переданный аргумент сначала объявляется как class(derived_from_parent), allocatable или class(derived_from_parent), pointer, но фиктивный аргумент должен иметь форму class(parent), оставляя , allocatable или , pointer? Я правильно интерпретировал ваши комментарии? С таким синтаксисом процедура правильно примет производный тип? - person Mackie Messer; 08.03.2014
comment
Если вы делаете это таким образом, все в порядке, IanH имел в виду более сложный случай, когда вам по какой-то причине нужно, чтобы манекен был выделяемым или указателем. В этом случае объявленные типы должны совпадать. - person Vladimir F; 08.03.2014