2012-03-13 12 views
8

Kısa sürüm: Bir klişe işaretçisinin işaret ettiği adresi nasıl alabilirim?Bir ctypes işaretçisi tarafından işaret edilen bellek adresini al

Uzun versiyon: Bir C kütüphanesi ile geri arama olarak bir python işlevi kaydettim. C kütüphanesi void (*p_func)(char stat, char * buf, short buf_len) fonksiyon imzasını bekler, böylece uygun bir python fonksiyonunu kaydederim. Python işlevine girdiğimde, buf ile işaret edilen bellek adresini bilmek istiyorum. Bunu nasıl yapabilirim?

+1

{} etiketlerini kullanarak bazı kaynak kodu gönderdiyseniz bu yardımcı olur. Teşekkürler. – octopusgrabbus

+1

Bunu kendim 'ctypes.addressof (buf.contents) 'ile düzelttim ama henüz kendi sorumu yanıtlayamıyorum. –

+0

http://docs.python.org/library/functions.html#id işlevinin "kimliğini" aradığınızı düşünüyorum. [1] 'de: a = 4 In [2]: id (a) Out [ 2]: 10019764 –

cevap

9

Bu belgeyi okuyarak kendim düzeltdim.

Kitaplık tarafından ayrılan bir bellek bloğu bellek konumunu bilmek istedim. Söz konusu bloğa işaret eden klişe işaretçisi vardı. Bloğun hafıza adresini almak için ctypes.addressof(p_block.contents)'u kullandım.

Anlaşmamın etrafında p_block.contents != p_block.contents karışıklık oluştu, ancak daha sonra tüm p_block.contents nesnelerinin aynı temel arabelleğe sahip olduğunu farkettim. Temel tamponun adresi, ctypes.addressof ile elde edilir.

+1

Bu, 'p' bir işaretçi olduğu yerdeki '& (* p) 'ifadesine benzer. Garip olan şey, ctiplerin "ctypes.POINTER" işlevi tarafından döndürülen rastgele işaretçi türü için bir 'value' özniteliği tanımlamamasıdır. 'Ctypes.c_void_p' class *, 'value' niteliğine sahiptir, ancak' ctypes.POINTER 'tarafından döndürülen sınıf yoktur. Çok garip, hırslı ve neredeyse tamamlanmamış uygulama reeks. – amn

+1

FYI https://bugs.python.org/issue26565, "Temel olmayan göstergelere değer özniteliği ekle": >> Bildiğim kadarıyla (p.contents) addressof yapabiliriz, ama c_void_p ve c_char_p içerdiği biraz tutarsız Değer özniteliğinde aynı bilgi. > Bir c_char_p veya c_wchar_p işaretçisinin "değeri" bir Python bayt veya str nesnesidir. "Değer" sürekli olarak adres değeri olmayacağından, tüm işaretçi türleri için tutarlı bir şekilde uygulanabilen salt okunur bir "as_void" özniteliğinin tanıtılması daha iyi olabilir (işlev işaretçileri dahil). – memeplex

İlgili konular