Çok boyutlu dizilerin parametre olarak tanımlanması
Yazdığımız programların genelinde değişmeden kullanılacak ancak gerektiği zaman tek yerden değiştirebileceğimiz sabitler kullanırız. Bu sabitler FORTRAN77'de "common block" olarak tanımlanıyordu ancak Fortran 90/95 ve sonrasında bu kullanım kaldırıldı. Bu kullanım yerine modüllerden destek alınmalıdır. Bu yazıda hem skaler değişkenlerin hem de tek ve çok boyutlu dizilerin (array) parametre olarak tanımlanmasını anlatmaya çalışacağım.
Bir çok dosyadan oluşan programlarımızda tüm dosyalarda kullanılacak ortak sabitleri bir modülde aşağıdaki gibi tanımlayabiliriz.
1 2 3 4 | module sabitler implicit none real,parameter :: pi = 3.14 end module sabitler |
Bu yolla tanımladığımız sabitleri ana programımızda, subroutine'lerde veya function'larda aşağıdaki gibi kullanabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | program deneme use sabitler real,external :: fonksiyonum call rutinim write(*,*) fonksiyonum(2.) end program deneme function fonksiyonum(x) use sabitler real,intent(in) :: x real :: fonksiyonum fonksiyonum = x*pi end function fonksiyonum subroutine rutinim use sabitler write(*,*) pi end subroutine rutinim |
Buradaki kod bir ana program, bir reel sayı ile pi sabitinin çarpımını döndüren bir fonksiyon ve pi sabitinin değerini ekrana yazdıran bir subroutine'i içeriyor. Gördüğünüz gibi her 3 öğede de sabitler modülü kullanılıyor, dolayısıyla da pi sabitinin değeri sabitler modülünde tanımlandığı gibidir. Bu 3 öğe ayrı dosyalarda da tanımlanabilirdi.
Buraya kadar yazdıklarım genel tanımlamalar, esas işin zor kısmı dizilerde. 1. dereceden bir dizi (böyle bir diziye vektör de denebilir) aşağıdaki gibi kolaylıkla parametre olarak tanımlanabilir.
Bu şekilde yapılan tanımlama biçimine array constructor denilir ve görüldüğü gibi çok kullanışlı-basit bir yöntemdir. Ancak yalnızca 1. dereceden dizilerde işe yarar dolayısıyla çok boyutlu (örneğin 3x3 matris) dizilerde ufak ancak genelde bilinmeyen bir hile yapacağız.
Ben 2. dereceden bir dizi için yapılacak işlemi özetleyeceğim, aynı mantık daha yüksek derecelere de kolayca uygulanabilir. M'e N boyutlu bir dizi için M ile N'in çarpımı kadar boyutlu 1. dereceden bir dizi oluşturup daha sonra onu M'e N boyutlu bir dizi olarak şekil değiştireceğiz. Bu işlem için "reshape" fonksiyonundan faydalanacağız.
Bu ifade ile 6 boyutlu 1. dereceden dizinin array constructor'ı yardımıyla 2'ye 3 boyutlu 2. dereceden bir diziyi parametre olarak tanımlıyoruz.
Fortran ile ilgili çok fazla Türkçe kaynak bulunmuyor, ben burada yalnızca insanların zorlanabileceğini düşündüğüm özel noktaları paylaşıyorum ancak soru sormaktan çekinmeyin vakit buldukça cevap yazarım.