我想将可分配数组的一部分传递给子例程。源数组的大小由三个索引确定。子程序需要一个具有两个索引的数组。假设我想对源数组的第五个索引进行操作。我做了这样的事情,但在最后一行被抓住了:
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(????)
假设我想处理要点第五部分中的元素。如果我尝试
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
,但这似乎不太合适。有办法做我想做的事吗?
除非您想解除分配或分配process_points(:)
中的伪参数,否则不应使其可分配。或者,如果您想通过调用保留下限,但实际参数必须是可分配的。
即使子数组是可分配数组的子数组,它也永远不可分配。因此,决不能将子数组传递给需要可分配参数的子例程。
所以我只需要删除子程序中的allocatable
属性。