0

在我的代码中,由于我使用的机器存在内存问题,因此我想在传递参数期间分配尽可能少的内存。我的示例代码:

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

在主程序中,我必须使用堆内存。我还想在我的子程序中使用堆内存。根据我所做的搜索,它给出了运行错误(尝试分配已分配的数组'arrayb')。

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

4

3 回答 3

2

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

你想要的只是以一种简单的方式传递它,就像你最初拥有它一样

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

! operations with arrayB

那很好。如果您在显示时传递连续数组,则不会复制。阅读有关通过引用传递的信息按引用传递与按值传递有什么区别?

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

于 2015-11-10T15:06:36.023 回答
0

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

于 2019-09-19T16:35:39.300 回答
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
于 2015-11-12T15:05:19.090 回答