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

时间:2018-12-03 19:51:09

标签: arrays fortran

我想将可分配数组的一部分传递给子例程。源数组的尺寸为三个索引。该子例程期望一个带有两个索引的数组。假设我要对源数组的第五个索引进行操作。我做了这样的事情,但是被最后一行抓住了:

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,但这似乎并不明智。有办法做我想做的事吗?

1 个答案:

答案 0 :(得分:3)

除非您要取消分配或分配它,否则不应在process_points(:)内部分配哑参数。或者,如果您想保留调用的下限,但是您的实际参数必须是可分配的。

子数组是永远不会分配的,即使它是可分配数组的子数组也是如此。因此,您绝不能将子数组传递给需要可分配参数的子例程。

所以我只删除子例程中的allocatable属性。