正在尝试将可分配数组的部分作为子例程参数传递



我想将可分配数组的一部分传递给子例程。源数组的大小由三个索引确定。子程序需要一个具有两个索引的数组。假设我想对源数组的第五个索引进行操作。我做了这样的事情,但在最后一行被抓住了:

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属性。

最新更新