2016-03-31 7 views
0

任意の数のネストされたループをFortranで作成する方法は何ですか?私が正しくあなたを理解していれば任意の数のネストされたループをFortranで作成する方法は何ですか?

do i1 = 1,n1 
do i2 = 1,n2 
do i3 = 1,n3 
do i4 = 1,n4 
... 
! use i1,i2,i3,i4,....,ik for something 
... 
enddo 
enddo 
enddo 
enddo 
+0

私はかつて、特定の問題(C言語)の非常に基本的で悪い解決策としてこれをしなければなりませんでした。簡単に言えば、私が思い出す限り、必要なネストされたループでファイルを書き出し、それを使用したプロジェクトをコンパイルして実行するラッパースクリプトがありました。それは実際に働いた。 – zdim

+2

これはむしろ質問を招待します*なぜあなたはこれをやりたいのですか?*例えば、あなたが周りを見回すと、答えが任意の深さのループネストを作る方法を尋ねる質問があります* '* function *。他の人にとっては、再帰的なアプローチが適切です。だから、なぜあなたはこれをしたいのですか? –

+0

私はこれに任意の階数のテンソルを変換したいと思っていますが、物理的には "透明"に見えるコードを持っています。 – lenzinho

答えて

0

だから、あなたは、ネストされたループを作成する必要があります(通常は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 
関連する問題