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
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
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? –
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