在我的代码中,由于我使用的机器,我有内存问题,所以我希望在传递参数时分配最少的内存。我的示例代码:
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数组在内存中保存一些空间是不错的。我感谢任何帮助符合我的目的。
答案 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)
如果过程具有一个可分配的伪参数,则在任何调用范围中都需要一个显式接口。您可以通过在主程序中为子例程放置一个接口块来提供该显式接口。更好的选择是将子例程放在模块中,然后在主程序中使用该模块。然后会自动创建显式接口。