将二维数组作为一维参数 fortran 传递给子例程

Pass 2d array to subroutine as 1d argument fortran

我想将一个二维数组传递给子例程,并将该数组视为一维参数。我试图以这种方式传递它: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

如果我将子程序中的参数数组更改为可分配的,并将主程序中传递的参数保留为显式定义的数组(例如 (2,2)),我仍然会得到相同的错误。

在子例程 array_method(第一个)中,将 allocatable 属性赋予伪参数。这要求实际参数也具有该属性。

但是,实际参数是 i(1,:),它 不可分配 ,即使 i 本身是。

现在,根据您在第一种情况下要执行的操作,虚拟参数不需要具有 allocatable 属性。除非你想改变分配状态(你不能给 intent(in)),或者使用 i 的 "real" 边界,你可以没有它。