我有一个下面的代码,有一个抽象类型,继承类型和一个简短的程序,在那里我创建了一个对象并将其存储在一个数组中。
module m
implicit none
type :: container
class(a), allocatable :: item
end type container
type, abstract :: a
integer, public :: num
end type a
type, extends(a) :: b
integer, public :: num2
end type b
end module m
program mwe
use m
implicit none
class(a), allocatable :: o1
class(container), allocatable :: arr(:)
o1 = b(1, 2)
allocate(arr(2))
arr(1) = container(o1)
select type(t => o1)
type is(b)
write(*,*) t%num, t%num2
end select
select type(t => arr(1)%item)
type is(b)
write(*,*) t%num, t%num2
end select
end program mwe
问题是,输出如下所示:
1 2
1 0
可以看出,存储在数组中的同一变量将第二个变量置为空。为什么会发生这种情况?是因为数组的类型是a
,它只包含第一个变量吗?
我正在用ifort version 18.0.3
编译代码。
发布于 2018-06-08 17:43:40
我相信
arr(1) = container(o1)
无效的Fortran 2008。这是一个内部赋值语句,但标准的第7.2.1.2节规定
在内部赋值语句中,(1)如果变量是多态的,它应该是可分配的,而不是共数组。
据我所知,arr(1)
是多态的,但不是可分配的,因此符合标准的编译器应该发出一个错误并中止编译。
如果我的推理正确,英特尔Fortran编译器编译此代码的事实是编译器错误,应向英特尔报告。
https://stackoverflow.com/questions/50756696
复制相似问题