Python ctypes Notlarım – 2

Merhaba arkadaşlar, bir önceki yazımda ctypes’e giriş yapmıştık. Bugün, ctypes veri türlerine göz atacağız.

Ctypes Veri Türleri

 

ctypes type C type Python type
c_bool _Bool bool (1)
c_char char 1 karakterli byte nesnesi
c_wchar wchar_t 1 karakterli string
c_byte char int
c_ubyte unsigned char int
c_short short int
c_ushort unsigned short int
c_int int int
c_uint unsigned int int
c_long long int
c_ulong unsigned long int
c_longlong __int64 veya long long int
c_ulonglong unsigned __int64 veya unsigned long long int
c_size_t size_t int
c_ssize_t ssize_t veya Py_ssize_t int
c_float float float
c_double double float
c_longdouble long double float
c_char_p char * (sonlandırılmış NULL) bytes object veya None
c_wchar_p wchar_t * (sonlandırılmış NULL) string veya None
c_void_p void * int veya None

Her ctypes değişken türü Python’da nesne olarak kabul edilir. Değişken oluşturalım,

Yukarıdaki kod öbeğini çalıştırıp sayi değişkenini yazdırdığımızda c_long(42) yazıcaktır. Burada int oluşturduk long çıktı diye kafanız karışmasın ikiside aynı anlama geliyor zaten. Örnekte C int türünde değeri 42 olan bir değişken oluşturduk, bu değişkenin değerini Python’a çevirip kullanmak için .value parametresini kullanmamız gerekiyor. Value parametresi hem get hemde set olarak kullanılabilir, şöyle ki;

Python

Çıktı

Mutable Memory

Eğer değişken bellek bloklarına ihtiyacınız olursa, create_string_buffer() fonksiyonu ile oluşturabilirsiniz. Bellek bloklarını değiştirmek veya erişebilmek için .raw parametresini kullanmamız gerekiyor.

Python

Çıktı

9 '\x00\x00\x00\x00\x00\x00\x00\x00\x00'


Görüldüğü üzere bellekte 9 baytlık bir boşluk oluşturduk. Yazdığımız kodu incelememiz gerekirse; sizeof fonksiyonu ctypes’a bağlı bir fonksiyon ve C dilinde operatör olarak karşımıza çıkar, yaptığı şey ise bayt cinsinden depolama miktarını gösterir. repr fonksiyonu python’un kendi içerisinde bulunan __builtin__ nesnesi içerisinden gelir, yaptığı şey ise oldukça basit, ascii karakterle karşılaşssa bile bize çıktı olarak girilen parametrenin karakter karşılıklarını verir.

Değişken türlerinde de olduğu gibi direk Python karşılığı değere dönüştürmek için .value parametresini kullanabiliriz.

Şu şekilde kullanımda mümkündür;

Python

Çıktı


Değişen tek şey değerimiz oldu. Arabellek bayt değerimiz başlangıçta da belirttiğimiz gibi 10’da kaldı.

Değişken Türü Oluşturmak

C veri türlerine giriş yaparken bu yazımızın baş satırlarında Ctypes’da bulunan veri türlerinin nesne yani sınıf olduğundan bahsetmiştik. Haliyle kendi türlerimizi oluşturmakta oldukça kolay hale geliyor. Kendi türümüzü oluşturmaktaki amaçlardan biri, C ile yazılmış fonksiyonlarda direk olarak kullanabilmemizi sağlar. printf fonksiyonu ile bir örnek yapalım.

Ekrana sizinde tahmin edeceğiniz gibi 24 adet ornek tur vardir. yazacaktır. C fonksiyonlarına direk erişim sağlayabilmek için _as_parameter_ argümanını kullanmanız gerekmektedir. Ayrıca oluşturacağınız değişken türü byte, integer veya string olmak zorundadır.

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *