猿问

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

我在 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

我经历了这个问题的解决方案,但无法解决错误。先感谢您!


波斯汪
浏览 580回答 1
1回答

Qyouu

您的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)&nbsp; # This is the equivalent of your `nofentry`>>> float_arr_ptr<__main__.LP_c_float_Array_100 object at 0x000001921ED85A48>>>> type(float_arr_ptr) is FloatArr100PtrTrue>>>>>> float_ptr = ctypes.cast(float_arr, ctypes.POINTER(ctypes.c_float))&nbsp; # 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]))()&nbsp; # 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)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nofnode, noftree, terminal.ctypes.data_as(ctypes.POINTER(ctypes.c_int)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c_int(nofterminal),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nofobservations.ctypes.data_as(ctypes.POINTER(ctypes.c_int)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;total, nofseries,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ctypes.cast(nofentry, ctypes.POINTER(ctypes.c_float)))
随时随地看视频慕课网APP

相关分类

Python
我要回答