将2d数组传递给子程序作为1d参数fortran

时间:2015-01-23 14:06:12

标签: arrays arguments fortran

我想将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)),我仍会得到相同的错误。

1 个答案:

答案 0 :(得分:2)

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

但是,实际参数是i(1,:),即使i本身是

现在,根据您在第一种情况下要执行的操作,伪参数不需要具有allocatable属性。除非你想改变分配状态(你不能给出intent(in)),或者使用i的“真实”界限,否则你可以不用它。