我正在尝试定义一个子程序,它分配不同类型的数组。以下是代码的简化版本:
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。
答案 0 :(得分:2)
看起来像编译器错误,适用于Gfortran和Solaris Studio。我建议您联系英特尔官方支持。
正如IanH指出的那样,其他编译器可能会编译错误。无论如何,无论是否符合标准,该过程仍然是无用的,因为要使select类型工作,变量仍然必须已经分配,因为过程的实际参数必须是多态的。你不能只在那里传递real, allocatable
。
答案 1 :(得分:0)
没有分配具有intent(out)属性的变量,因此Vec将没有类型,并且SELECT TYPE(VEC)是不可定义的。