使用ctypes将数组参数指针传递给外部函数的正确方法是什么?

时间:2015-08-27 04:31:15

标签: python ctypes

我的问题与以下类型的错误消息有关

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) )

但如果我可以直接传递数组会更好(因为我有相当大的参数列表)。

0 个答案:

没有答案
相关问题