python - ArgumentError:预期 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
我经历了这个问题的解决方案,但无法解决错误。先感谢您!
解决方案
您的nofentry值是一个指向float数组的指针,而generate_codebook需要一个指向float的指针。ctypes不能自动进行这种转换,因此必须手动执行(使用[Python 3]:ctypes.cast ( obj , type ))。
例子:
>>> 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)
翻译成你的代码:
将 nofenentry定义更改为:
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)))
推荐阅读
- android - 无法获得 Google 云端硬盘授权
- scala - 在 Apache spark 中读取包含分隔符的值的 CSV 文件
- c++ - 如何获取泛型 lambda 的返回类型和参数类型?
- c++ - 即使我使用字符串空格,也使用 >> 和 getline 获取空输出
- angular - 手动角度运行类型检查
- excel - 我找不到将 excel 文件读入 pyspark 数据框的代码
- c# - 如何将 JObject 插入 MongoDB?
- pdf - Xamarin 表单:Word 文档未在 ios 应用程序中打开
- json - 通过 Azure Datafactory V2 将 XML 与 REST API 结合使用
- identityserver4 - 如何通过 IdentityServer 连接到 Azure B2c