如何将C头转换为Python ctypes代码?
问题描述:
typedef struct _node_t {
int value;
struct _node_t* next;
} node_t;
的c头可译为像的下方。
class node_t(Structure):
pass
node_t._fields_ = [
('value', ctypes.c_int),
('next', POINTER(node_t))
]
但是,我不能翻译带有void和回调函数的c-header代码。 我应该如何将下面的c-header翻译成Python c型代码?
class PacketHandlerDelegate_D(Structure):
pass
PacketHandlerDelegate_D._fields_ = [
// Delegate object
void *delegate;
// Callback functions
void (*addSampleToA)(void *delegate, int sample1, int sample2);
void (*addSampleToB)(void *delegate, unsigned short int signalfast, unsigned short int signalSlow);
void (*addSampleToC)(void *delegate, char x, char y, char z);
void (*addSampleToD)(void *delegate, unsigned short int sample);
void (*addSampleToE)(void *delegate, short int sample);
]
答
阅读的文档,可以通过CFUNCTYPE
生成函数的指针的类型。退货类型void
由None
表示。可以使用c_void_p
作为空指针。
因此,例如:
ADD_SAMPLE_TO_B_TYPE = CFUNCTYPE(None, c_void_p, c_ushort, c_ushort)
...
PacketHandlerDelegate_D._fields_ = [
...
(addSampleToB, ADD_SAMPLE_TO_B_TYPE),
...
]
P.S.由于您在PacketHandlerDelegate_D
中没有递归声明,所以您可以在类体中定义这些声明:
class PacketHandlerDelegate_D(Structure):
...
addSampleToB = ADD_SAMPLE_TO_B_TYPE
...