2016-03-31 23 views
0

Fortran'da keyfi sayıda iç içe döngüler oluşturmanın yolları nelerdir? Örneğin, iç içe döngüler k sayısı zamanında tespit edilebilir şekilde içinde: ÖyleyseFortran'da keyfi sayıda iç içe döngüler oluşturmanın yolları nelerdir?

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

Bir keresinde bunu yapmak zorundaydım, belli bir soruna (C) çok basit ve kötü bir çözüm olarak. Özetle, hatırladığım kadarıyla, gerekli yuvalanmış döngüleri içeren dosyayı yazıp daha sonra onu kullanan projeyi çalıştıran bir sarmalayıcı komut dosyası vardı. Aslında işe yaradı. – zdim

+2

Bu soruyu daha çok davet ediyor. * Bunu neden yapmak istiyorsun? * Örneğin, etrafına bakacak olursanız, cevabın keyfi olduğu derinlemesine döngü yuvalarının nasıl yapılacağını soran sorular bulacaksınız. * Bir elemental kullanın '* işlevi *. Diğerleri için tekrarlayıcı bir yaklaşım uygundur. Peki, neden bunu yapmak istiyorsun? –

+0

Bir tensör keyfi dizisini dönüştürmek ve yine de fizik açısından "şeffaf" görünen bir koda sahip olmak istiyorum. – lenzinho

cevap

0

seni doğru anladıysam eğer, iç içe geçmiş döngüleri (yapmak gerekir ve genellikle bir iç içe döngüler tutmak istiyor en az).

Fakat derleme zamanında kaç tane yuva yapmanız gerektiğini bile bilmiyorsunuz.

Eğer bu sorunla karşılaşırsam, yuvaları tek bir döngüde açabilir ve çeşitli indisleri sıfırdan hesaplayabilirdim. İşte denediğim bir örnek:

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 
İlgili konular