Memory 具有可分配数组的子例程调用
在我的代码中,由于我使用的机器,我有内存问题,所以我希望在传递参数时分配尽可能少的内存。我的示例代码:Memory 具有可分配数组的子例程调用,memory,fortran,allocatable-array,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(
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”)
因此,我的目的是在子例程中也使用堆内存,并在参数从程序传递到子例程的过程中分配尽可能少的内存,如上面的代码所示。现在,我想我会做复印作业,我知道,这并不好。我检查了模块、接口和包含块,但不太清楚哪一个块适合使用AllocateAbel数组在内存中节省一些空间。非常感谢任何符合我目的的帮助。阵列已分配,您无法再次分配。这样做也毫无意义。此外,可分配的伪参数需要使用模块或类似模块的显式接口。但谁知道您的实际代码是什么样子的呢 您想要的是以一种简单的方式传递它,就像您最初使用它一样
subroutine mySub ( arrayB, n )
integer :: n
double precision :: arrayB(n)
! operations with arrayB
那很好。如果您通过了连续复制,则不会复制
数组,如您所示。阅读有关通过引用传递的信息
您也可以使用假定形状数组(:)
,但要小心,您需要显式接口(最好使用模块)。在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
如果一个过程有一个伪参数,即可分配参数,那么在任何调用范围中都需要一个显式接口。您可以通过在主程序中为您的子例程放置一个接口块来提供该显式接口。更好的替代方法是将子例程放在一个模块中,并在主程序中使用该模块。然后自动创建显式接口。在子例程
mySub
中,数组arrayB
不可分配。你能澄清你的意思吗?请显示你运行的确切代码和你收到的确切错误消息,我们没有任何水晶球。您显示的代码很好,不会进行任何不必要的复制。与您的问题无关,但是程序结束前的停止
和返回
和子例程
是不必要的。我将重复我理解的检查内容。为了使用“arrayb”的动态内存,我需要显式接口,这是可以的。当我将大小为n的“arrayA”传递给代码示例中的子例程时,我不会为“arrayB”分配另一个n量的内存空间?这部分我不清楚。根据URL示例,我认为我发送的只是一个指针,它指示“arrayA”的地址,子例程使用这个指示器。这就是我所理解的。当您想要避免复制时,为什么要分配一个新数组?你不想再来一个!您希望使用原始版本。参数传递的工作方式是被调用的子例程获取引用,知道原始数组的位置,并直接使用它。我想知道在传递参数的过程中是否复制了数组,但现在你已经向我解释清楚了。谢谢你的解释。是的,Fortran 90没有可分配的参数,但是Fortran 95和TR-15581有,我知道的所有编译器都支持,所以谁在乎呢?请注意,您确实需要为假定的shape数组参数提供一个显式接口,但在代码段中没有显示它。