2013-04-10 109 views
2

所以我想读取一个无符号的短数组,它是由我使用的C库中的一个空指针返回的。标题中的函数定义如下:Python的ctypes如何从无效指针读取数组返回

void* Foo(int a, int b) 

该函数最终返回一个指向unsigned short类型数组的指针。

在python中,我一直试图返回数组使用ctypes没有成功。这里是我的:

import ctypes 
import numpy as np 

libc = ctypes.cdll.LoadLibrary("Library.dll") 

Vec=np.zeros((1000,),dtype=np.uint16) 

c_ushort_p = ctypes.POINTER(ctypes.c_ushort) 
Vec_p=confVec.ctypes.data_as(c_ushort_p) 

libc.Foo.restype = ctypes.c_void_p 
Vec_p=libc.Foo(1,1) 

print Vec_p 

这将返回“无”。

如果我尝试:

... 
libc.Foo.restype = ctypes.c_void_p 
Vec_p=libc.Foo(1,1) 

print Vec_p[0] 

我得到类型错误: 'NoneType' 对象有没有属性 '的GetItem'。

我也试过这样:

... 
libc.Foo.restype = ctypes.c_void_p 
Vec_p=ctypes.cast(libc.Foo(1,1),c_ushort_p) 

print Vec_p 

它返回,在那里打印Vec_p [0]给出 “ValueError异常:NULL指针访问”

谁能给我任何帮助吗?

+1

第二次尝试似乎没问题,但是设置了'Foo.restype = c_ushort_p'而不是强制转换。然后,无论您获得数组“length”,都可以使用'np.ctypeslib.as_array(Foo(a,b),(length,))'创建一个NumPy视图。 – eryksun 2013-04-11 01:05:06

回答

3

该DLL正在返回一个空指针。这些在ctypes中表示为None。

我不知道为什么函数的行为如此,但你看到的输出很清楚你的函数返回null。

+0

谢谢。我认为我使用ctypes是错误的。事实证明,我的程序其他地方有一个简单的错误。 – Wilsonator 2013-04-11 00:16:08