Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.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_C++_Ctypes - Fatal编程技术网

Python ctypes的数组输出?

Python ctypes的数组输出?,python,c++,ctypes,Python,C++,Ctypes,我需要使用ctypes从Python调用一个C函数,并让该函数向Python提供一个或多个数组。数组总是简单的类型,比如long、bool、double 我非常希望阵列能够动态调整大小。每次通话前我都会知道所需的号码,但不同的通话应该使用不同的尺码 我想我应该在Python中分配数组,让C代码覆盖内容,这样Python最终可以取消分配它分配的内存 我控制Python和C代码 我现在有一个不起作用的: C: 产生: start test [1, 1, 1, 1, 1, 1, 1] [1, 1, 1

我需要使用ctypes从Python调用一个C函数,并让该函数向Python提供一个或多个数组。数组总是简单的类型,比如long、bool、double

我非常希望阵列能够动态调整大小。每次通话前我都会知道所需的号码,但不同的通话应该使用不同的尺码

我想我应该在Python中分配数组,让C代码覆盖内容,这样Python最终可以取消分配它分配的内存

我控制Python和C代码

我现在有一个不起作用的:

C:

产生:

start test
[1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1]
test finished
应产生:

start test
[1, 1, 1, 1, 1, 1, 1]
[0, 1, 2, 3, 4, 5, 6]
test finished

为什么这不起作用?或者我需要用另一种方式来实现吗?

C数组是使用python列表构建的;两者都是不同的对象。代码是打印python列表,它不受
Foo
调用的影响

您需要构建C数组,传递它,然后在调用后使用它:

arrayType = ctypes.c_long * 7
array = arrayType(*[1] * 7)
print list(array)
errorCode = FooFunction(array, len(array))
print list(array)

感谢falsetru的快速回答。我没有马上注意到,同时我也意识到了这一点,这似乎也起了作用。我想知道一个是否比另一个好

print "start test"
FooFunction = GpGlobals.LoadedDll.Foo
longArrayType = ctypes.c_long * (7)
FooFunction.argtypes = [longArrayType, ctypes.c_long]
FooFunction.restype = ctypes.c_long

pyArray = longArrayType()
for l in pyArray:
    print l        
errorCode = FooFunction(pyArray, 7)
for l in pyArray:
    print l
print "test finished"

我最初并不认为这适用于动态大小的数组,但我所要做的就是在每次调用之前重新定义argtypes。

也许可以尝试Cython+numpy,请参见这里@mirosval:不,谢谢。这个解决方案已经够复杂了,谢谢。我找到了另一个选项,我已经发布了,但我将您的答案标记为解决方案,因为您首先到达那里,而且您的答案对我的原始代码的更改小于我自己的代码。不过,不知出于什么原因,一个比另一个更可取?绩效问题。我是新来的。我需要做些什么才能收到电子邮件通知?最好在
argtypes
中使用
ctypes.POINTER(ctypes.c_long)
,因为它接受任何
long*
指针,包括作为指针传递的任何大小的
long
数组。至于迭代结果而不是创建一个列表,如果您实际上不需要创建一个列表,那么这是首选。不需要在两个对象中复制数据。
arrayType = ctypes.c_long * 7
array = arrayType(*[1] * 7)
print list(array)
errorCode = FooFunction(array, len(array))
print list(array)
print "start test"
FooFunction = GpGlobals.LoadedDll.Foo
longArrayType = ctypes.c_long * (7)
FooFunction.argtypes = [longArrayType, ctypes.c_long]
FooFunction.restype = ctypes.c_long

pyArray = longArrayType()
for l in pyArray:
    print l        
errorCode = FooFunction(pyArray, 7)
for l in pyArray:
    print l
print "test finished"