【发布时间】:2017-06-15 02:46:05
【问题描述】:
我有一个 c 库,我想用 python 2.7 ctypes 包装。
typedef struct SRSLTE_API{
void *ptr;
uint32_t R;
uint32_t K;
uint32_t framebits;
bool tail_biting;
float gain_quant;
int16_t gain_quant_s;
int (*decode) (void*, uint8_t*, uint8_t*, uint32_t);
int (*decode_f) (void*, float*, uint8_t*, uint32_t);
void (*free) (void*);
uint8_t *tmp;
uint8_t *symbols_uc;
}srslte_viterbi_t;
如何在 python 中创建这个结构?这是我目前拥有的。
from ctypes import *
class srslte_viterbi_t(Structure):
_fields_ = [("ptr", c_void_p),
("R", c_uint),
("K", c_uint),
("framebits", c_uint),
("tail_biting", c_bool),
("gain_quant", c_float),
("gain_quant_s", c_short),
("decode", POINTER(c_int)),
("decode_f", POINTER(c_int)),
("free", c_void_p),
("tmp", POINTER(c_ubyte)),
("symbols_uc", POINTER(c_ubyte))
]
viterbi_t = srslte_viterbi_t(None, c_uint(0), c_uint(0), c_uint(0),
c_bool(False), c_float(0.0), c_short(0), None, None, None, None, None)
此结构编译但不给出正确的结果。我担心我没有正确分配解码功能?线是什么
int (*decode) (void*, uint8_t*, uint8_t*, uint32_t);
还是在结构中做事?
【问题讨论】:
-
如果你从不直接调用函数指针
decode、decode_f和free,你应该可以使用c_void_p。如果你需要调用它们,你应该通过CFUNCTYPE定义函数类型。 -
仅供参考,在分配给结构字段时,您不需要构造简单类型的实例,例如
c_uint。您可以使用本机 Python 类型,例如viterbi_t = srslte_viterbi_t(None, 0, 0, 0, False, 0.0, 0, None, None, None, None, None)。但是由于您将所有内容初始化为零,您可以简单地使用viterbi_t = srslte_viterbi_t()。 ctypes 在分配结构时将其归零。 -
c_uint不是uint32_t,它是原生的 unsigned int 类型,无论大小如何。c_short相同。请改用c_uint32、c_int16。 -
另外,您能在这里定义没有给出正确结果 的含义吗?你已经用上面的零填充了它......