我想将2d数组传递给子程序,并将此数组视为1d参数。我试图以这种方式传递它:subroutine(array(1,:))。如果我明确定义数组,这是有效的。但是,如果数组是可分配的,我会收到以下错误:' array'的实际参数必须是可分配的 我怎样才能做到这一点?
以下是一些简短的示例代码,它给出了上述错误:
program array
implicit none
integer,dimension(:,:),allocatable::i
allocate(i(2,2))
i(1,1)=1
call array_method(i(1,:))
contains
subroutine array_method(i)
implicit none
integer,allocatable,dimension(:),intent(in)::i
write(*,*) i(1)
end subroutine array_method
end program array
如果我将代码更改为显式定义的数组(如下所示),则可以正常工作。但是,我想用可分配的数组来做。
program array
implicit none
integer,dimension(2,2)::i
i(1,1)=1
call array_method(i(1,:))
contains
subroutine array_method(i)
implicit none
integer,dimension(2),intent(in)::i
write(*,*) i(1)
end subroutine array_method
end program array
如果我将子程序中的参数数组更改为allocatable并将主程序中传递的参数保留为显式定义的数组(例如(2,2)),我仍会得到相同的错误。
答案 0 :(得分:2)
在子例程array_method
(第一个)中,将allocatable
属性赋予伪参数。这要求实际参数也具有该属性。
但是,实际参数是i(1,:)
,即使i
本身是, 。
现在,根据您在第一种情况下要执行的操作,伪参数不需要具有allocatable
属性。除非你想改变分配状态(你不能给出intent(in)
),或者使用i
的“真实”界限,否则你可以不用它。