gpt4 book ai didi

python - 如何将 C 头文件转换为 Python ctypes 代码?

转载 作者:行者123 更新时间:2023-11-30 16:40:21 27 4
gpt4 key购买 nike

下面的 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 和回调函数的 c 头代码。我应该如何将下面的 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);

]

最佳答案

阅读文档,函数指针类型可以通过 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),
...
]

附注由于您在 PacketHandlerDelegate_D 中没有递归声明,因此您可以在类主体中定义它们:

class PacketHandlerDelegate_D(Structure):
...
addSampleToB = ADD_SAMPLE_TO_B_TYPE
...

关于python - 如何将 C 头文件转换为 Python ctypes 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46700724/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com