为了账号安全,请及时绑定邮箱和手机立即绑定

预期的 LP_c_float 实例而不是指向 LP_c_float_Array_50000 的指针

预期的 LP_c_float 实例而不是指向 LP_c_float_Array_50000 的指针

波斯汪 2021-12-09 14:46:30
我在 dll 文件中有一个函数,它将浮点指针作为参数之一(参数 9:float *result)。void generate_codebook(int *nodestatus, int *nofnode, int *noftree, int *terminal,  int *nofterminal, int *nofobservations, int *total, int *nofseries,  float *result)这是我遇到问题的python代码:nofseries=c_int(len(nofobservations))noftree=c_int(terminal.shape[1])nofnode=c_int(nodestatus.shape[0])total=c_int(np.sum(nofobservations,dtype=np.int64))nofentry=ctypes.POINTER(ctypes.c_float *(len(nofobservations)*nofterminal*terminal.shape[1]))()mydll.generate_codebook.argtypes = [POINTER(c_int), POINTER(c_int), POINTER(c_int), POINTER(c_int),                                  POINTER(c_int), POINTER(c_int), POINTER(c_int), POINTER(c_int), POINTER(c_float)]result=mydll.generate_codebook(nodestatus.ctypes.data_as(ctypes.POINTER(ctypes.c_int)),                               nofnode,noftree,terminal.ctypes.data_as(ctypes.POINTER(ctypes.c_int)),                               c_int(nofterminal),                               nofobservations.ctypes.data_as(ctypes.POINTER(ctypes.c_int)),total,                               nofseries,                              ctypes.byref(nofentry))在调用 generate_codebook 函数时,我在需要 LP_c_float 实例的最后一个参数中遇到参数错误。下面是错误:<ipython-input-28-f73a7383211e> in generatecodebook(nodestatus, terminal, nofterminal, nofobservations) 16                                    nofobservations.ctypes.data_as(ctypes.POINTER(ctypes.c_int)),total, 17                                    nofseries,---> 18                                   ctypes.byref(nofentry))ArgumentError: argument 9: <class 'TypeError'>: expected LP_c_float instance instead of pointer to LP_c_float_Array_50000我经历了这个问题的解决方案,但无法解决错误。先感谢您!
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

您的nofentry值是一个指向float数组的指针,而generate_codebook需要一个指向float的指针。ctypes的不能自动执行这样的转换,所以它必须被手动执行(使用[Python的3]:ctypes的铸造(OBJ,类型))。


例子:


>>> import ctypes

>>>

>>> dim = 100

>>>

>>> FloatArr100 = ctypes.c_float * dim

>>> FloatArr100Ptr = ctypes.POINTER(FloatArr100)

>>>

>>> float_arr = FloatArr100(*range(dim))

>>> float_arr[4], float_arr[38], float_arr[99]

(4.0, 38.0, 99.0)

>>>

>>> float_arr_ptr = ctypes.pointer(float_arr)  # This is the equivalent of your `nofentry`

>>> float_arr_ptr

<__main__.LP_c_float_Array_100 object at 0x000001921ED85A48>

>>> type(float_arr_ptr) is FloatArr100Ptr

True

>>>

>>> float_ptr = ctypes.cast(float_arr, ctypes.POINTER(ctypes.c_float))  # This is what you should do

>>>

>>> float_ptr

<__main__.LP_c_float object at 0x000001921ED859C8>

>>> float_ptr[4], float_ptr[38], float_ptr[99]

(4.0, 38.0, 99.0)

翻译成你的代码:


将nofentry定义更改为:


nofentry = (ctypes.c_float * (len(nofobservations) * nofterminal * terminal.shape[1]))()  # Notice dropping `ctypes.POINTER`

调用时mydll.generate_codebook,替换


ctypes.byref(nofentry)


ctypes.cast(nofentry, ctypes.POINTER(ctypes.c_float))

所以最后它看起来像:


result = mydll.generate_codebook(nodestatus.ctypes.data_as(ctypes.POINTER(ctypes.c_int)),

                                 nofnode, noftree, terminal.ctypes.data_as(ctypes.POINTER(ctypes.c_int)),

                                 c_int(nofterminal),

                                 nofobservations.ctypes.data_as(ctypes.POINTER(ctypes.c_int)),

                                 total, nofseries,

                                 ctypes.cast(nofentry, ctypes.POINTER(ctypes.c_float)))


查看完整回答
反对 回复 2021-12-09
  • 1 回答
  • 0 关注
  • 579 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信