我的问题与以下类型的错误消息有关
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_c_long instance instead of LP_c_long_Array_9
通过运行以下代码
发生from ctypes import *
DLL = windll.test
ex = DLL.ex_
ex.rstype = None
ex.argtypes = ( POINTER(c_int), )
N = 9
N_array = (c_int * N)()
for i in xrange(N):
N_array[i] = i + 3
N_array_p = pointer( N_array )
DLL.ex_( N_array_p )
外部函数ex
接受一个指向int参数的指针。它修改了N_array
的内容,所以我认为我需要创建指针N_array_p
,但这似乎是错误的。
我似乎能够通过将数组传递给函数而不创建指针DLL.ex_( N_array )
来解决问题。但是,这是正确的做事方式吗?我可以依靠这项工作吗?
我在ctypes文档(15.17.1.15)中注意到
此外,如果在argtypes中将函数参数显式声明为指针类型(例如POINTER(c_int)),则可以将指向类型的对象(在本例中为c_int)传递给该函数。在这种情况下,ctypes会自动应用所需的byref()转换。
但是,当一个人不想修改引用的对象时,使用byref
(据我所知)。在这里,我确实想要修改数组,事实上我似乎可以。那么发生了什么? Ctypes似乎为我生成了一个指针,而不是引用。
顺便说一句,我也可以使用cast
来改变指针类型
N_array_p = cast( N_array, POINTER(c_int) )
但如果我可以直接传递数组会更好(因为我有相当大的参数列表)。