Bir bilgisayar mühendisi için programlama dili, öğrendiklerini sınadığı, deneyler yaptığı bir laboratuardır ve mühendisler deneylerini, kestiremedikleri sonuçları gözlemlemek için değil, öngördükleri sonuçları doğrulamak için yapar...

Visual Basicte İşaretçiler (Pointerlar)

Visual Basicte işaretçiler için özel değişken tipleri olmadığı halde bazı API çağrıları işaretçi parametreler gerektirebilir...

İşaretçiler C ve türevlerinde genelde dinamik diziler oluşturmak amacıyla kullanılırlar ve VB6, özel işaretçi değişkenlere gerek bırakmayacak yerleşik komutlara zaten sahiptir (ReDim ve ReDim Preserve). Bu yüzden işaretçiler VB6da çok kullanılmadığı için pek göz önünde değildirler ve bir VB6 programcısının karşısına pek çıkmazlar...

Aslında işaretçilerin ne işe yaradıkları düşünüldüğünde bir dilin bu tip değişkenlere sahip olup olmadığı sorusu önemini yitirir. İşaretçiler bellek üzerindeki bir adresi işaret ederler. Yaptıkları tek şey adres bilgisi saklamaktır ve sakladıkları adres değerini basit long tipinde bir değişken içerisinde saklamak mümkündür. Dolayısıyla işaretçi değişkenlerin varlığından çok, asıl sorgulanması gereken şey referans ve dereferans operatörlerinin varlığıdır...

Referans operatörlerinin yerine geçebilen anahtar sözcüklere sahip olmasına rağmen VB6, bir işaretçinin işaret ettiği adres konumundan direkt olarak veri okuyamaz. Ancak sistem çağrıları ile hem adres alma hem de adresten okuma işlemleri gerçekleştirilebilir. Referans ve dereferans operatörlerinin görevi kernel32 kütüphanesinin RtlMoveMemory fonksiyonu ile yerine getirilebilir. Yöntem aşağıda örneklenmiştir...

Bazı sistem çağrıları parametre olarak bir işaretçi alabilir. Genelde bu parametreler "Any" tipinde tanımlanır. Any tipi, tip denetimini devredışı bırakır ve çağrılan fonksiyonlara herhangi bir değişkenin gönderilebilmesine olanak sağlar. VB6nın bu tip parametrelere adres yollayabilmesi için VarPtr, StrPtr veya ObjPtr fonksiyonları kullanılabilir. Bu fonksiyonlar C dilindeki & operatörünün görevini yerine getirir. Bu sayede adres alma işleminin gerçekleştirilmesi için RtlMoveMemory fonksiyonuna gerek kalmaz...

ObjPtr nesnelerin, VarPtr herhangi bir değişkenin adresini verir. StrPtr ise string tipli değişkenlerin adresini döndürür ve diğerlerinden farklı olarak, asıl konumdan 4 bayt sonrasını verir. Çünkü string tipli bir değişken, konumlandırıldığı yerin ilk 4 baytını uzunluğu belirtmek için kullanır. Ayrıca string tipli bir değişkenin her karakteri 2 bayt yer kaplar.

Private Declare Sub Kopyala Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, _
    Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
    Dim a As Integer
    a = 5
    Dim Adresi As Long
    Adresi = VarPtr(a) 'Adresini alıyoruz.

    Kopyala ByVal Adresi, 56, 2 'Adresin bulunduğu konuma 2 baytlık veri yazdık.

    MsgBox a 'İşaretçinin işaret ettiği bölgeye yazdığımız veri değişkene de yansıdı.

    Dim b As Integer
    Kopyala b, ByVal Adresi, 2 'Dereferans operatörünün işlevini yerine getirtmiş olduk.

    MsgBox b
End Sub

Bunlar dışında bu konuda bahsedilmesi gereken ByVal ve ByRef anahtar sözcükleri var. ByVal değişkenin bir kopyasını oluşturur. ByRef ise değişkenin kendisini alır. C++ dilindeki kullanım ile karşılaştıracak olursak "ByRef degisken as integer" ifadesi C++'ta "int &degisken" ifadesine denktir...

Sayfayı
Yayın tarihi: 13 Temmuz 2010 Salı, 10:24
Anahtar kelimeler: vb6 işaretçilar, pointerlar, referans operatörü

Yorum Gönder

 
Yorumunuzu -1. yoruma yanıt olarak gönderiyorsunuz. Yanıtlamayı iptal etmek için buraya tıklayabilirsiniz.

 

Yorumlar

Onaylanmış yorum bulunmuyor.
 
 
Sayfa 37 sorgu ile 0.004 saniyede oluşturuldu.
Atasoy Blog v4 © 2008-2017 Hüseyin Atasoy