Fortranで可変サイズの配列を作成する方法はありますかのスタック? Allocate()はヒープ上に配列を配置するため、私にとっては機能しません。これは並列化の問題につながる可能性があります(私の他の質問: OpenMP: poor performance of heap arrays (stack arrays work fine)を参照してください)。もちろん、いくつかのスマートなメモリ管理はその問題を回避する方法を提供しますが、Fortranのメモリ管理は愚かなものです。Allocate()を使用しないFortranの可変サイズ配列
基本的に、私はCで、次のFortranの同等を探しています:
scanf("%d", N);
int myarray[N];
再反復する:これは、コンパイル時に、配列のサイズを決定したので、私は
Integer, PARAMETER :: N=100
Integer, Dimension(N) :: myarray
を望んでいません時間。どちらも必要ありません
Integer, Dimension(:), Allocatable :: myarray
read(*,*) N
Allocate(myarray(1:N))
ヒープ上に配列が配置されるためです。
非常に感謝します。私は最近、上記の問題の問題に遭遇するまで、割り当て可能な配列に非常に満足していました。この質問に否定的な答えがある場合、私は非常にソースへのリンクを感謝します。
編集:M.S.B.の回答へのコメントを参照してください。これを行うエレガントな方法は、Fortran 2008でのみ可能になりました。これはblock
構造で行われます。
ありがとう、M.S.B.! Cの 'int array [N]'と比較すると重くて、それはトリックです。 – drlemon
Fortran 2008のブロック構造を使用して、コードの真ん中の宣言であるCに近いものを実行できます。例えば、p。 ftp://ftp.nag.co.uk/sc22wg5/N1701-N1750/N1729.pdfの12。どのコンパイラがこれをサポートしているのか、OpenMPでサポートしているのか分かりません。 –
私のコードにはこの構造がありますが、デフォルトではgfortranはまだ配列をヒープに配置していますが、今はタイトなループの途中でmallocを使用しています。オプション "-fstack-arrays"が必要なようです。 – DaveP