我试图定义一个分配不同类型数组的子例程。这是代码的简化版本:
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。
最佳答案
似乎是一个编译器错误,适用于 Gfortran 和 Solaris Studio。我建议您联系英特尔官方支持。
正如 IanH 指出的那样,其他编译器可能在编译时出错。无论如何,无论是否符合标准,该过程仍然是无用的,因为要使选择类型起作用,变量仍然必须已经分配,因为过程的实际参数必须是多态的。你不能只在那里传递real, allocatable
。
关于compiler-errors - SELECT TYPE 构造中的多态性分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26284342/