我想将可分配数组的一部分传递给子例程。源数组的尺寸为三个索引。该子例程期望一个带有两个索引的数组。假设我要对源数组的第五个索引进行操作。我做了这样的事情,但是被最后一行抓住了:
module lots_of_stuff
...
contains
subroutine process_points(points)
integer, allocatable, intent(inout) :: points(:,:)
! do stuff
end subroutine
end module
program foo
use lots_of_stuff
integer, allocatable :: inpoints(:,:,:)
integer :: lim1, lim2, lim3
! figure out how big inpoints should be (i.e. set lim1, lim2, lim3) then ...
allocate(inpoints(lim1,lim2,lim3)
! populate inpoints then ...
call process_points(????)
假设我要处理inpoint的第五部分中的元素。如果我尝试
call process_points(inpoints(:,:,5))
gnu fortran告诉我
Error: Actual argument for ‘badpts’ must be ALLOCATABLE at (1)
如果我尝试
call process_points(inpoints(1,1,5))
gnu fortran告诉我
Error: Rank mismatch in argument ‘badpts’ at (1) (rank-2 and scalar)
我想我可以将inpoints(:,:,5)
复制到具有两个索引的数组中并将其发送到process_points
,但这似乎并不明智。有办法做我想做的事吗?
答案 0 :(得分:3)
除非您要取消分配或分配它,否则不应在process_points(:)
内部分配哑参数。或者,如果您想保留调用的下限,但是您的实际参数必须是可分配的。
子数组是永远不会分配的,即使它是可分配数组的子数组也是如此。因此,您绝不能将子数组传递给需要可分配参数的子例程。
所以我只删除子例程中的allocatable
属性。