Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用ctypes将数组参数指针传递到外部函数的正确方法是什么?_Python_Ctypes - Fatal编程技术网

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

Python 使用ctypes将数组参数指针传递到外部函数的正确方法是什么?,python,ctypes,Python,Ctypes,我的问题与以下类型的错误消息有关 ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_c_long instance instead of LP_c_long_Array_9 外部函数ex使用一个指向int参数的指针。它修改了N_数组的内容,因此我认为需要创建指针N_数组p,但这似乎是错误的 通过将数组传递给函数而不创建指针DLL.ex(N\u数组),我似乎可以解决这个问题。然而,

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

ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_c_long instance instead of LP_c_long_Array_9
外部函数
ex
使用一个指向int参数的指针。它修改了
N_数组的内容,因此我认为需要创建指针
N_数组p
,但这似乎是错误的

通过将数组传递给函数而不创建指针
DLL.ex(N\u数组)
,我似乎可以解决这个问题。然而,这是正确的做法吗?我能依靠这个工作吗

我在ctypes文档中注意到(15.17.1.15)

此外,如果函数参数在argtypes中显式声明为指针类型(例如指针(c_int)),则可以将指针类型的对象(在本例中为c_int)传递给函数。在这种情况下,ctypes将自动应用所需的byref()转换

但是,
byref
在不想修改引用对象时使用(据我所知)。在这里,我确实想修改数组,而且似乎我可以。那么到底发生了什么?Ctypes似乎为我生成了一个指针,而不是一个引用

顺便说一句,我还可以使用
cast
更改指针类型,使代码正常工作

N_array_p = cast( N_array, POINTER(c_int) )

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

谢谢@eryksun,所以我不需要为这种情况下的强制转换而烦恼:-)我写了“似乎是错误的”,因为错误发生了。我不认为我对您隐藏了任何Python代码,所以它看起来确实是不正确的。你为什么说“它有效”?对不起,检查一下会有帮助。我忽略了ctypes对类型检查的挑剔程度<代码>指针(N_数组)
创建一个
LP_c_int_数组9
,不幸的是,它不被
LP_c_int
参数接受。无论如何,只需直接传递数组,而无需创建指针或使用
byref
,因为C数组会自动作为指向第一个元素的指针传递。
N_array_p = cast( N_array, POINTER(c_int) )