我想将2d数组传递给子例程,并将此数组视为1d参数。我试图以这种方式传递它:subroutine(array(1,:))。如果我显式定义数组,则此方法有效。但是,如果数组是可分配的,则会出现以下错误:'array'的实际参数必须为ALLOCATABLE。如何使这项工作有效?
这是一些简短的示例代码,它给出了上面的错误:
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
如果我将子例程中的参数数组更改为可分配,并将传递的参数保留在主程序中作为显式定义的数组(例如(2,2)),我仍然会遇到相同的错误。
在子例程array_method
(第一个例程)中,将allocatable
属性赋予哑元参数。这要求实际参数也具有该属性。
然而,实际的说法是i(1,:)
这是不分配,即使i
本身。
现在,根据您要在第一种情况下执行的操作,哑元参数不需要具有该allocatable
属性。除非您想要更改分配状态(您无法给出intent(in)
),或者使用的“实际”范围i
,否则就可以不使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句