|
Geleneksel olarak Pascal dilinde dizi yapıları hep sabit boyuttadır. Dizi veri tipinde bir yapı tanımladığınızda bu dizinin boyutunuda belirlemeniz gerekir. Uzman kullanıcılar tarafından bilinen bir kaç tane dinamik dizi yapıları tanımlamanın yolları vardır. Tipik olarak pointer kullanıp gerekli hafıza reservasyonunun ayırmak yada tekrar sisteme bırakmak gibi. Delphi 4 kullanımı çok kolay olan dinamik dizi tanımlama eklentileri ile nirlikte gelmektedir. Dinamik dizi yapılarından "Long Stringler" dinamik olarak sistemden gerekli hafıza alanını temin ederler fakat copy-on-write tekniğini kullanmazlar. ( Copy-on-write : Diyelimki 500 karakterlik A ve B adında iki karakter dizisi değişkeniniz var. başta ikiside aynı bilgileri gösteriyor olsun. İşte böyle birdurumda hafızadan 500 karakterlik yer ayrılır 1000 değil ve iki değişkende aynı yeri gösterir. Fakat A değişkeninin herhangi bir karakterinde değişiklik yaptığınız anda a değişkeni hafızadan diğer 500 lük yeri ayırır ve değişime uğramış halini o alana kopyalar. Kısaca değişiklik yapılmadan önce hafızadan 500 lük alan tahsis edilmişti ama herhangi birisindeki değişiklikten sonra ikinci bir 500 lük yer ayırılır. Zaten olması gerekende budur.) aslında bu büyük bir sorun değildir bir değişkenin sistemden aldığı hafıza alanını, o değişkene NIL atayarak tekrar sisteme kazandırabilirsiniz. Artık belli bir boyut belirtmenden bir dizi tanımlayıp daha sonra bu diziyi SETLENGTH prosedürünü kullanrak istediğiniz şekilde boyutlandırabilirsiniz. Aynı prosedüre içerisinde bilginin mevcut olduğu bir dizide bilgiyi kaybetmeyecek şekildede kullanılabilir. Bunun yanında string yapılarına özgü COPY gibi başka fonksiyonlarda bulunmaktadır. İşte size küçük bir kod alıntısı. Altını çizerek belirtmeliyimki dizi değişkenini tanımladıktan sonra kullanmadan önce boyutlarını belirtmelisiniz. procedure TForm1.Button1Click(Sender: TObject);
Genel Pascal dizileri 0 olmayan alt tabanlı ve integer olmayan indisleri kabul etmezler. İşte dinamik dizilerin uymadığı kurallarda bunlardır. Yani 100 lük bir dinamik dizinin alt sınırı 0 üst sınırı 99 dur. Dinamik bir dizinin durumu hakkında bilgi edinmek için diğer dizilerde kullanılan Length, High, Low gibi fonkiyonları kullanabilirsiniz. Bununla birlikte dinamik dizilerde Low prosedürü 0 geriye döndürürken High da dizinin uzunluğunun bir eksiğini geriye dönderir. Boş bir dizi için ilginçtirki low 0, high -1 geriye dönderir.
Bütün bu kısa tanıtımdan sonra DynArr adındaki basit bir örneği sizlere gösterebilirim. Bu gerçektende basit bir örnek zira karmaşık dinamik dizi yapıları bulunmamakta. Bu örneğin diğer bir amacıda programcıların yapabileceği olası hataları göstermek. Program iki tane global dizi tanımlamakta ve bunlardan birincisini OnCreate tutamacında kullanıma hazırlamaktadır. var
Yukarıdaki kod bütün değerleri 0 olarak tanımlamaktadır. Bu başlangış kodu herhangi bir hafıza hatasına yer vermeden diziyi kullanıma hazırlamaktadır. Daha iyi bir sıfırlama işlemi için dizinin bütün elemanlarının içeriğini değiştiren butonun kodu aşağıdaki gibidir : procedure TForm1.btnFillClick(Sender: TObject);
Grow adındaki düğme dizinin içeriğini kaybetmede boyutlarını büyütmek için kullanılır. Bunu Grow düğmesine bastıktan sonra Get düğmesine basarak test edebilirsiniz. procedure TForm1.btnGrowClick(Sender: TObject);
Tek karmaşık olan kod Alias düğmesinin OnClick olayında bulunmakta. Program := operatörünü kullanarak dizilerden birisini diğerine kopyalar. Bu noktadan sonra dizilerden birisinde değişiklik yaptığınızda diğeride etkilenir. Çünkü ikiside aynı hafıza alanını göstemektedir. procedure TForm1.btnAliasClick(Sender: TObject);
BtnAliasClick metodu iki tane dahaişlem gerçekleştirmektedir. İlki dizilerin eşitliğini test eder. Bu test dizilerin gerçek elemanlarını değilde dizilerin gösteridiği hafıza alanlarını kontrol eder. procedure TForm1.btnAliasClick(Sender: TObject);
ikincisi ise Copy fonksiyonuna yapılan çağrıdır. Bu fonksiyon verileri bir diziden diğerine taşımanın ötesinde ilk diziyi fonksiyon tarafından yaratılan yenisiyle değiştirir. Bu sebeple Array1 değişkeni düğmeye basıldıktan sonra 11 elemanlı bir diziyi gösterir. Bu sebeple Get yada Set düğmelerinden birine basılınca hafıza hatası üretilir ve bir exception çıkarılır. Fill butonunun kodu bu değişiklikten sonrada işe yarar çünkü dizinin boyutları için Low ve High fonksiyonu kullanılmıştır. |
© 1999 Mustafa Kasap. Tüm Hakları saklıdır.