【发布时间】:2014-09-25 00:18:14
【问题描述】:
我正在尝试调用 dll 中的函数。该函数称为pop(),它接受两个参数,一个int 和一个指向int 的指针。第一个参数是从第二个参数开始的数组的长度。此函数应返回一个指向 int 的指针,该指针是 n-1 元素数组中的第一个元素,其中 n 是原始数组中的元素数。返回的数组应该是原始数组,没有第 0 个元素。
我的代码:
from ctypes import cdll, c_int, POINTER
lib = cdll.LoadLibrary('extlib.dll')
lib.pop.restype = POINTER(c_int)
#lib.pop.restype = c_int*4
testArray = (c_int*5)(*[5,6,7,8,9])
output = list(lib.pop(5, testArray)[0:4])
print output
按原样运行时,它会产生以下(预期的)输出:
[6, 7, 8, 9]
如果我取消注释注释行,并注释它上面的行,我会得到这个(意外的)输出:
[6618688, 0, 2, 0]
似乎c_int*4 和POINTER(c_int) 类型不同,因为我相信这就是我所做的全部更改。但是,the Python documentation 似乎暗示它们应该是相同的。这里发生了什么?具体来说,为什么两个版本的代码执行的不一样?
【问题讨论】:
-
64 位 Windows 和/或 Python?
-
64 位 Windows 和 Python
-
我猜它归结为指针和数组在 C 中实际上并不是相同的东西,即使它们非常相似。
-
尝试使用
c_void_p或c_longlong代替c_int,因为它们在64 位Windows 上应该是指针大小(c_int仍然是32 位)。 -
@figs c_void_p 和 c_longlong 都给出了不同的和不需要的输出。我还测试了 c_long 和 c_short,它们同样给出了不希望的结果。
标签: python arrays pointers ctypes