Как и в случае ответа от ripero , можно сказать, что любой вывод из программы действителен.Тем не менее, мы можем сделать простую модификацию кода, чтобы сделать его правильным Fortran. 1 Этот ответ касается этой модифицированной версии.
Я бы назвал этот неожиданный вывод и обратился за помощью кпоставщик компилятора.
Использование конструктора структуры с полиморфными размещаемыми компонентами является одной из новых областей в Фортране.Компиляторам может потребоваться некоторое время, чтобы наверстать упущенное или сделать это правильно.
Я проверил ваш код с Intel Fortran 18.0.2 и вижу тот же вывод.
По вашему вопросу
Это потому, что массив имеет тип a
, который содержит только первую переменную?
Нет: в части select type
с выводом t
не являетсяполиморфная сущность типа b
.
Вы можете обойти эту проблему, избегая использования конструктора структуры:
arr(1)%item = o1
Я также вижу, что компиляторы Intel до 18.0.2 по-прежнему делают что-то другое.
1 С объявлением
class(container), allocatable :: arr(:)
arr
является полиморфным и выделяемым.Как отмечает Риперо, это означает, что arr(1)
, элемент arr
является полиморфным.Однако, как элемент массива, arr(1)
сам по себе не является полиморфным и поэтому не может находиться слева от внутреннего оператора присваивания.Мы можем изменить код двумя способами: предоставить определенное назначение или сделать arr
не полиморфным.В коде вопроса, по-видимому, нет причин для того, чтобы контейнер был полиморфным, поэтому я рассмотрю
type(container), allocatable :: arr(:)
Далее, как описано в комментариях к вопросу, если вы хотите работать с gfortran 8, илиранее, чтобы увидеть, что происходит, вы должны также изменить код в вопросе так, чтобы определение производного типа container
следовало после определения производного типа a
.