だから、あなたは、ネストされたループを作成する必要があります(通常は1はにネストされたループを維持したいと考えています。たとえば、ネストされたループkの数は、実行時に決定することができるような方法で、最小)。
コンパイル時には、実行する必要のある巣の数は分かりません。
もし私がこの問題を抱えていたら、おそらくネストを単一のループにラップして、最初からさまざまなインデックスを計算します。ここに私が試した例があります:
program nested
implicit none
integer :: num_nests, i
integer, dimension(:), allocatable :: nest_limits
integer, dimension(:), allocatable :: nests
print *, "Please enter number of nests:"
read(*, *) num_nests
allocate(nest_limits(num_nests))
allocate(nests(num_nests))
print *, "Please enter nest limits:"
read(*, *) nest_limits
nests(:) = 1
outer_loop : do
print *, nests(:)
i = 1
! Calculate the next indices:
inner_loop : do
nests(i) = nests(i) + 1
! If this is still a valid index, exit the inner
! loop and go for the next iteration
if (nests(i) <= nest_limits(i)) exit inner_loop
! The index has overflown, so reset it to 1 and
! move to next index.
nests(i) = 1
i = i + 1
! If the next index would be outside of num_nests,
! the whole loop is finished.
if (i > num_nests) exit outer_loop
end do inner_loop
end do outer_loop
end program nested
私はかつて、特定の問題(C言語)の非常に基本的で悪い解決策としてこれをしなければなりませんでした。簡単に言えば、私が思い出す限り、必要なネストされたループでファイルを書き出し、それを使用したプロジェクトをコンパイルして実行するラッパースクリプトがありました。それは実際に働いた。 – zdim
これはむしろ質問を招待します*なぜあなたはこれをやりたいのですか?*例えば、あなたが周りを見回すと、答えが任意の深さのループネストを作る方法を尋ねる質問があります* '* function *。他の人にとっては、再帰的なアプローチが適切です。だから、なぜあなたはこれをしたいのですか? –
私はこれに任意の階数のテンソルを変換したいと思っていますが、物理的には "透明"に見えるコードを持っています。 – lenzinho