子程序调用可分配数组

时间:2015-11-10 14:14:25

标签: memory fortran allocatable-array

在我的代码中,由于我使用的机器,我有内存问题,所以我希望在传递参数时分配最少的内存。我的示例代码:

program test
double precision, ALLOCATABLE :: arrayA(:)
allocate (arrayA(n))

call mySub (arrayA)

deallocate (arrayA)

stop
end

subroutine mySub ( arrayB )
double precision, ALLOCATABLE :: arrayB(:)

allocate (arrayB(n))
! operations with arrayB

return
end

在主程序中,我必须使用堆内存。我也想在我的subrotuine中使用堆内存。根据我的搜索,它会出现运行错误(尝试分配已分配的数组'arrayb')。

因此,我的目的是在我的子例程中也使用堆内存,并在从程序传递到子例程的过程中分配尽可能少的内存,就像上面的代码一样。现在,我想我会复制作业,据我所知,这并不好。我检查了模块,接口和包含块但是不清楚用allocatabel数组在内存中保存一些空间是不错的。我感谢任何帮助符合我的目的。

3 个答案:

答案 0 :(得分:2)

在分配数组时,您无法再次分配数组。这样做也没有任何意义。此外,可分配的伪参数需要使用模块或类似的显式接口。但谁知道你的实际代码是什么样的。

你想要的只是以原来的方式传递它

subroutine mySub ( arrayB, n )
  integer :: n
  double precision :: arrayB(n)

! operations with arrayB

这很好。如果您通过连续的,则不会复制 数组显示它。阅读通过引用传递What's the difference between passing by reference vs. passing by value?

您也可以使用假定的形状数组(:),但要小心,您需要显式接口(最好使用模块)。

答案 1 :(得分:0)

在Fortran中(至少在Fortran 90或以前的版本中),不可能使用子例程分配数组并将分配的数组返回给主程序。在您的情况下,您不应该在子例程中分配数组。因此你的子程序可能是:

subroutine mySub ( arrayB )

double precision :: arrayB(:)

! operations with arrayB

return
end

然后你可以传递任何与arrayB具有相同等级的数组,但实际的参数必须已经在main中分配,就像你一样。

     program test

double precision, ALLOCATABLE :: arrayA(:)

allocate (arrayA(n))

call mySub (arrayA)

deallocate (arrayA)

stop
end

答案 2 :(得分:0)

如果过程具有一个可分配的伪参数,则在任何调用范围中都需要一个显式接口。您可以通过在主程序中为子例程放置一个接口块来提供该显式接口。更好的选择是将子例程放在模块中,然后在主程序中使用该模块。然后会自动创建显式接口。