Yazan : Şadi Evren ŞEKER
Sitede gelen bir soru üzerine bu yazıyı yazmaya karar verdim. Bilgisayar dilleri (makine işlemeli diller, machine processing languages) tasnif edilirken, visual basic gibi görsel tasarıma dayalı diller üst seviye dil (high level langauge) olarak kabul edilirler. Hatta hiç kod yazmadan program üretilmesine izin verdiği için visual basic’i bir dilden çok görsel geliştirme ortamı olarak kabul eden (basic’i dil ancak visual basic’i bir geliştirme ortamı) tasnifler söz konusudur.
Göstericiler (pointers) ise tam tersine düşük seviyeli dillerde daha çok ihtiyaç duyulan ve programın geliştirildiği bilgisayarın hafızasına (ram) doğrudan erişim yapan yapılardır. Dolayısıyla tanım itibariyle visual basic ve gösterici (pointer) kavramları birbiri ile uyuşmazlar. Ancak .Net teknoloji ile birlikte nesne yönelimli programlama (object oriented programming) yapısı kazanan adeta kabuk değiştiren visual basic ile gösterici kullanımı ihtiyacı artmıştır.
Nesne yönelimli dillerin çoğunda (örn. JAVA) doğrudan gösterici kullanımı bulunmaz. Bunun yerine nesne atfı ismi verilen (object referrer) yapılar kullanılır ve bu yapılar aslında birere göstericidir.
Visual basic de nesne yönelimli programlama ile birlikte bu nesne atıflarını içermiş ve artık gösterici yapısını nesne yönelimli olarak içermiştir ancak biz bu yazı kapsamında, nesne yönelimli programlanın bize sunduğu bu imkanı bir kenara bırakarak, saf visual basic dilinde göstericileri nasıl kullanabileceğimizi irdeleyeceğiz.
Konuyu aşağıdaki örnek üzerinden anlamaya çalışalım.
Yukarıda, C dilinde yazılmış basit bir gösterici kodu bulunmaktadır. Kodumuzun 7. Satırında p isimli bir tam sayı göstericisi (integer pointer) tanımlanmış, 8 . satırda bu göstericinin gösterdiği yerde 1 tam sayı konulacak bir yer hafızada ayrılmış (memory allocation) ve 9. Satıda bu göstericinin gösterdiği adrese 10 değeri konulmuştur.
Kodun 10. Satırında göstericinin adresi (hafızada nereyi gösterdiği ) ve gösterdiği yerdeki değerler ekrana basılmış ve 11. Satırda gösterici için ayrılan hafıza bölmesi serbest bırakılmıştır (free).
Yukarıdaki bu kodun çalışan hali aşağıda verilmiştir:
Şimdi yukarıdaki bu basit C dili ile yazılmış gösterici kodunu Visual Basic dili ile kodlamaya çalışalım.
Yukarıdaki kodu inceleyecek olursak, yapı olarak bir form yükleme fonksiyonuna yazılmış kodumuz, p ve hHeap isimli iki adet Long tipinde değişken tanımlayarak başlıyor. Buradaki p değişkenini bir gösterici olarak kullanacağız. Dikkat edilmesi gereken husus, p değişkeninde gösterici mantığında olduğu üzere bir hafıza bölmesinin adresinin tutulmasıdır. Yani C dilinde olan p göstericisinde nasıl hafızanın bir adresi tutuluyorsa, visual basic örneğinde de hafıza adresini tutmaya çalışacağız.
Öncelikle çalışan programımızın yani işlemin (process) çalıştığı alanı tutan hHeap isimli değişkenimizden HeapAlloc fonksiyonu ile (C dilindeki malloc benzeri) hafızada bir alan ayırması yapılıyor.
Bu ayırma sırasında 0’dan başlanarak 2 boyutunda ayırma işlemi yapılmıştır. 2 sayısı, visual basic dilindeki bir tamsayının (integer) hafızada kapladığı alan boyutudur.
Sonuçta kodun 22. Satırı itibariyle, p isminde bir değişken ve bu değişkenin içinde, hafızada bize ayrılmış 2 byte uzunluğunda bir alanın adresi bulunmaktadır.
Ardından 23. Satırda böyle bir adres ayrımı başarılı olduysa, artık bu adres alanına bir integer değer koymayı deneyebiliriz.
24. satırda i isimli bir tam sayı değişkeni tanımlanıyor, 25. Satırda bu değişkene sayısal olarak 10 değeri konuluyor ve sonunda 26. Satırda, p göstericimizin gösterdiği adrese, i değişkenin içindeki değer konuluyor. Bu sırada CopyMemoryWrite fonksiyonu kullanılmıştır. Bu fonksiyon kernel32 dinamik kütüphanesi içinde bulunan RtlMoveMemory fonksiyonudur. Dolayısıyla bu fonksiyonu kullanmak için aşağıdakine benzer bir şekilde kodun başında tanım yapılmalıdır:
Private Declare Sub CopyMemoryWrite Lib “kernel32” Alias _
“RtlMoveMemory” (ByVal Destination As Long, _
ByVal Source As Long, ByVal Length As Long)
Ardından j isimli bir değişken tanımlanarak, p göstericimizin gösterdiği hafıza alanına daha önceden (kodun 26. Satırında) yazdığımız değeri okumaya çalışıyoruz. Bunun içinde yine kernel32.dll kütüphanesinden tanımladığımız fonksiyonumuzu kullanıyoruz.
Sonuç bir mesaj kutusu içerisinde gösteriliyor ve nihayetinde 31. Satırda bu ayrılan hafıza alanı serbest bırakılmaktadır.
Visual basic ile yazılan bu kodun tamamını bu bağlantıdan indirerek deneyebilirsiniz.
merhabalar
arşiv hasarlı bi bakarmısız?
bende hata görülmüyor, belki geçici bir hatadır veya devam ediyorsa lütfen tam hatayı belirtin düzeltmeye çalışayım.
başarılar
hocam arşivi onarmayı denedim yinede hata verdi 🙁
crc hatası veriyo.
Kusura bakmayın, bir önceki mesajınızı yanlış anlamışım, sanırım rar dosyasını kastediyormuşsunuz. Ne yazık ki bende de bozuk görülüyor, en kısa sürede kodu tekrar proje haline getirip siteye koyarım. Ayrıca kodun açık hali yazıda bulunuyor, buradan yazıp çalıştırmanız da mümkün.
başarılar