如何将C头转换为Python ctypes代码?

时间:2017-10-12 03:01:32

标签: python c ctypes

下面的c-header

typedef struct _node_t {
int value;
struct _node_t* next;
} node_t;

可以翻译如下。

class node_t(Structure):
    pass

node_t._fields_ = [
        ('value', ctypes.c_int),
        ('next', POINTER(node_t))
]

但是,我无法使用void和call-back函数转换c-header代码。 我应该如何将c-header转换为Python c-types代码?

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);

1 个答案:

答案 0 :(得分:0)

阅读文档,函数指针类型可以由CFUNCTYPE生成。返回类型voidNone发出信号。 c_void_p可用于void指针。

例如:

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
    ...