2013-04-10 108 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