2013-07-04 50 views
1

我已經定義ctypes的結構,sommething這樣的:c_void_p值到void *

class MyStruct(Structure): 
    _fields_ = [('x', ctypes.c_ulonglong), ('y', ctypes.c_ulonglong)] 

然後我使ctypes的結構在python對象,並傳入該對象用Cython功能。

struct_instance = MyStruct(4, 2) 
some_cy_func(struct_instance) 

在cython函數中,我需要調用C函數,它接受MyStruct類型的參數。我們需要通過值來傳遞參數,而不是通過引用。函數的調用將使用cython,而不是通過ctypes。

我的問題是,如何從ctypes中獲得C結構的實際值,然後用cython將它傳遞給C函數。

目前我已經sommething這樣的:

ptr = ctypes.cast(ctypes.addressof(struct_instance), ctypes.POINTER(ctypes.c_void_p)) 
prt_content = ptr.contents 

在prt_content我有c_void_p(4),但是這並不能幫助我。有誰知道如何將cypes結構傳遞給通過cython包裝的C函數的一些方法,或者這可能根本不可能?

回答

1

Cython不知道ctypes。你必須使用一個Cython結構:

cdef struct MyStruct: 
    unsigned long long x 
    unsigned long long y 

cdef MyStruct struct_instance 

struct_instance.x = 4 
struct_instance.y = 2 

some_cy_func(struct_instance) 
+1

其實並不需要重寫到cython結構。我們可以得到C結構體的值。很簡單,我們只需要解引用ctypes.addressof(struct_instance) – user232343

相關問題