![]() |
Temel Yönleriyle Fortran 90 / 95 / 2003 | ||||||||||||||
|
* Fortran'a Giriş
* fortran.gantep.edu.tr
|
Bölüm 10: Dinamik Diziler
10.1 GirişBir program içerisinde, dizilerin boyutu ve kaç elemanlı olduğu program başında belirtilirse, derleyici o dizi için gereken bellek alanını (bölgesini) program sonlanıncaya kadar saklı tutar ve bu alan başka bir amaç için kullanılamaz. Bu türden diziler statik dizi olarak isimlendirilir. Statik dizinin boyutu programın çalışması esnasında (run time) değiştirilemez. Fakat, programın çalışırken bir dizinin boyutu ve eleman sayısı bazı yöntemler kullanılarak değiştirilebilir. Bu tür dizilere dinamik dizi denir. Dinamik diziler için gereken bellek bölgesi, derleyici tarafından işletim sisteminden istenir, kullanılır ve daha sonra (gerekirse) bu bölge boşaltırılır. Bu bölümde, Fortran 90+'da, dinamik dizi kavramı ve dinamik bellek yönetimi anlatılacaktır. 10.1 Dinamik Dizi BildirimiDerleme sırasında aşağıdaki gibi bir bildirim derleme hatasına sebep olmaz.
INTEGER, PARAMETER :: N = 10
REAL :: A(N)
Fakat, aşağıdaki gibi bir kullanıma Fortran (ve birçok dil) izin vermez:
INTEGER :: N ! Değişken bildirimi
PRINT *,"Eleman sayısını girin" ! Program çalışırken
READ *,N ! eleman sayısı isteniyor
REAL :: A(N) ! ve N elemanlı dizi oluşturuluyor.
Ancak bununla beraber, Fortran 90+ eleman sayısı programın çalışma zamanın da belirlenmesine müsaade eder.
Bu türden dinamik dizi bildirimi ALLOCATABLE deyimi kullanılarak olarak şöyle yapılır.
tip, ALLOCATABLE :: dizi
örneğin:
INTEGER, ALLOCATABLE :: A(:) ! dinamik vektör
REAL, ALLOCATABLE :: B(:,:) ! dinamik matris
Dinamik bir dizi tanımlandıktan sonra, dizinin eleman sayısı (sınırları) ALLOCATE deyimi ile belirlenir.
ALLOCATE(dizi(alt_indis:üst_indis),STAT=durum)
örneğin:
ALLOCATE(A(10)) ! 10 elemanlı bir vektör
ALLOCATE(B(4,4)) ! 4x4 bir matris
Burada INTEGER tipindeki durum değişkenin kullanımı isteğe bağlıdır. Eğer bu değişkene 0 (sıfır)
değeri atanırsa, istenilen (ayrılan) bellek bölgesinin sorunsuz kullanılabileceği anlamına gelir. Sıfırdan farklı bir değer
atanırsa talep edilen bellek miktarının yetersiz olduğu anlamındadır.
Son olarak, daha önce ayrılan bellek alanı DEALLOCATE boşaltılır.
DEALLOCATE(dizi)
Aşağıdaki adımlar dinamik bellek kullanımını Özetlemektedir.
! dinamik dizi bildirimi
INTEGER, ALLOCATABLE :: A(:)
! eleman saysını belirle
READ *,N
! N tane bellek bloğu isteniyor
ALLOCATE(A(N),STAT=durum)
! Boş yer varmı sorgulanıyor
IF(durum /=0 ) STOP "Yetersiz bellek alanı."
!
! A dizisi burada kullanılıyor...
!
! bellek bloğu boşaltılıyor
DEALLOCATE(A)
10.2 ÖrneklerÖRNEK 1: BİR KÜMENİN ORTALAMASI ve STANDART SAPMASIBu hesaplama daha önce Program 9.2'de yapılmıştı. Burada sadece dinamik dizi kullanılarak aynı işlem gerçekleştirilecek. Program 10.1: N sayının standart sapması ve ortalaması
ÇIKTI
ÖRNEK 2: BİR KÜMENİN MEDYANI Bir sayı kümesinin medyanı, sayılar küçükten büyüğe doğru sıralandığında, ortadaki sayıdır. Örneğin:3, 4, 4, 5, 6, 8, 8, 8, 10 kümesinin medyanı 6 Program 10.2: Dinamik dizi ile N tane sayının medyanı.
ÇIKTI
|