Python ctypes Notlarım – 3

Merhaba arkadaşlar bir önceki yazımda değişkenin nasıl oluşturacağına ve değişken türlerinin yapısına göz atmıştık. Bugün C değişken türleriyle dizi (array) oluşturmaya göz atacağız.

C tipi programlama dillerinde dizilerin boyutları önceden belirlenir. Python ctypes ile dizi oluşturmak biraz farklı yönden şöyle bir yol izlememiz gerekiyor.

Python

C

C dilinde de nasıl olduğunu görerek tanımlama kısmını hızlıca geçiyorum. Yine her iki dilde aynı görevi yapan basit bir örnek yapalım.

Python

C

Python ctypes’da her bir değişken türü nesne yani sınıf olduğundan referans değişkeni oluşturmak zorundayız. Ek olarak kendi oluşturduğumuz değişken türlerine de aynı şekilde dizi yapabiliriz.

Multi-Dimensional Array

Peki çok boyutlu dizileri Python ctypes’da nasıl oluştururuz. Yine aynı kullanımı var fakat söz dizim yapıları iki dilinde farklı olduğundan garipsememeniz elde değil.

Python

C


Kısaca belirtmek gerekirse; parantezin en içindeki değer dizimizin aslında en sonundaki boyutu oluyor. Pekiştirmek için hem C hem de Python ctypes ile bir örnek yapalım.

Python

C

Python’da dikkat etmemiz gereken en önemli nokta hemen hemen her yazımda söylüyorum değişken türleri sınıf yani nesne olduğu için başka bir değişkene referans atamamız gerekiyor. Bir üstteki örnekte atamadığınızda aşağıdaki gibi bir hatayla karşılacaksınız.

TypeError: ‘_ctypes.PyCArrayType’ object does not support item assignment

Son örneğimizde sayılar aynı ama yazdırma biçimi farklı olacaktır. Bunun sebebi Python print fonksiyonunun sonuna otomatik olarak \n eklediği içindir. Bire bir çıktı için, sys modülünü projeye dahil ederek sys.stdout.write fonksiyonu ile yazdırma yapmanız gerekmektedir. Bire bir kodların işleyişini kavramanız için ve kafa karışıklığına sebebiyet vermemesi için, python kodları arasına sys modülünü dahil etmedim. Yine göstereyim aklınızda soru işareti kalmasın, aşağıdaki iki Python kodu da aynı çıktıyı vermektedir.

python

print 99

python sys

Leave a Reply

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