Распределение полиморфизма в конструкции SELECT TYPE

Я пытаюсь определить подпрограмму, которая выделяет различные типы массивов. Вот упрощенная версия кода:

subroutine Allocation1(Vec)
    class(*), allocatable, intent(out)      :: Vec(:)

    select type(Vec)
    type is(real(8))
        allocate(Vec(10)); Vec = 0.D0
    type is(complex(8))
        allocate(Vec(10)); Vec = (0.D0,0.D0)
    type is(integer)
        allocate(Vec(10)); Vec = 0
    endselect
endsubroutine Allocation1

Но я получил три сообщения об ошибках, которые я не понимаю:

error #8306: Associate name defined in ASSOCIATE or SELECT TYPE statements doesn't have ALLOCATABLE or POINTER attribute   [VEC]

Как вы видете VEC является размещаемым массивом, поэтому я не думаю, что эта ошибка имеет смысл. Что это значит, и как мне заставить это работать?

Я использую IVF XE 14.0.1.139.

2 ответа

Решение

Похоже на ошибку компилятора, работает с Gfortran и с Solaris Studio. Я рекомендую вам обратиться к официальной поддержке Intel.

Как указывает IanH, возможно, что другие компиляторы по ошибке скомпилируют это. В любом случае, будет ли это соответствовать стандарту или нет, процедура все равно будет бесполезной, потому что для работы типа select переменная все равно должна быть уже выделена, потому что фактический аргумент вашей процедуры должен быть полиморфным. Вы не можете просто пройти real, allocatable там.

Переменная с атрибутом intent(out) не выделена, поэтому у Vec не будет типа, а SELECT TYPE(VEC) не определен.

Другие вопросы по тегам