【问题标题】:structures with functions and python ctypes具有函数和 python ctypes 的结构
【发布时间】: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);

还是在结构中做事?

【问题讨论】:

  • 如果你从不直接调用函数指针decodedecode_ffree,你应该可以使用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_uint32c_int16
  • 另外,您能在这里定义没有给出正确结果 的含义吗?你已经用上面的零填充了它......

标签: python c ctypes


【解决方案1】:

这是结构体的正确定义:

from ctypes import *

class srslte_viterbi_t(Structure):
    _fields_ = [
        ('ptr',c_void_p),
        ('R',c_uint32),
        ('K',c_uint32),
        ('framebits',c_uint32),
        ('tail_biting',c_bool),
        ('gain_quant',c_float),
        ('gain_quant_s',c_int16),
        ('decode',CFUNCTYPE(c_int,c_void_p,POINTER(c_uint8),POINTER(c_uint8),c_uint32)),
        ('decode_f',CFUNCTYPE(c_int,c_void_p,POINTER(c_float),POINTER(c_uint8),c_uint32)),
        ('free',CFUNCTYPE(None,c_void_p)),
        ('tmp',POINTER(c_uint8)),
        ('symbols_uc',POINTER(c_uint8))]

viterbi_t = srslte_viterbi_t()

结构在实例化时由ctypes 进行零初始化。

结构中的解码行是一个函数指针。 CFUNCTYPE 用于定义函数指针返回类型和参数。

【讨论】:

    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多