我在ifort 16中发生了索引重新映射的问题,但是在ifort 14或gfortran中没有出现(下面列出了确切的版本号)。问题出现在以下测试程序中:
program remap_problem
implicit none
type :: tp
real, dimension(:,:,:), allocatable :: trg_in
end type tp
real, dimension(:,:,:), allocatable, target :: trg_out
type(tp), target :: instance
real, dimension(:,:), pointer :: ptr
allocate(instance%trg_in(3,4,5))
allocate(trg_out(3,4,5))
ptr(0:2,0:3) => instance%trg_in(:,:,2)
ptr(0:2,0:3) => trg_out(:,:,2)
end program remap_problem
Fortran中有一条规则,如果目标是连续的或排名第一,您只能重新定义索引(使用0:2,0:3完成)。在此示例中,目标子数组是连续的,因为最后一个索引是Fortran中最慢的。
使用ifort 14或gfortran,它会正常编译。 但ifort 16抱怨派生类型中的目标数组不连续,我得到以下错误:
error #8527: If a bound remapping list is specified, data target must be simply contiguous or of rank one. [TRG_IN]
但是,trg_out. So
不会发生错误,不知何故,ifort 16不会将instance%trg_in(:,:,2)
识别为连续的,因为它在派生类型中。我尝试在此处添加关键字contiguous
并将allocatable
替换为pointer
,但似乎没有任何效果。
解决方法是:
ptr(0:2,-4:3) => instance%trg_in
将所需元素放在正确的索引上,但这很脏。是否有正确的方法来解决此问题,或者我是否必须等待编译器更新。
我的iforts和gfortran的版本是:
ifort(IFORT)14.0.2 20140120
ifort(IFORT)16.0.0 20150815
GNU Fortran(Debian 4.9.2-10)4.9.2