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

メイン プログラムでは、ヒープ メモリを使用する必要があります。また、サブロチュインでヒープメモリを使用したいと考えています。Acc を検索すると、実行エラーが発生します (既に割り当てられている配列 '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 に答える