2015-07-19 70 views
0

我已經做了大量的研究,沒有出現...我是Python和Ctypes的新手,我試圖從共享庫中調用函數。到目前爲止這麼好,但這些函數需要從.so中定義的結構中作爲參數特定的數據類型。我的問題是,我已經看到了如何在Python中聲明「類結構」的示例,但這是我在中的.so在Python中使用ctypes共享庫中的c結構

typedef struct noPDDE 
{ 
    void *x; 
    struct noPDDE *y; 
    struct noPDDE *z; 
}NoPDDE,*pNoPDDE; 

typedef struct PDDE 
{ 
    int tam; 
    pNoPDDE sup; 
}PDDE; 

我不知道如何將PDDE指針傳遞給函數。

任何幫助都很有用。非常感謝。

+0

'PDDE'是一個結構,而不是一個指針。你的意思是「傳遞一個PDDE結構的指針」? – cdarke

+0

正好。我的錯誤 –

回答

2

這是一個聲明中的ctypes遞歸結構的方式:

from ctypes import (
    Structure, 
    c_void_p, 
    POINTER, 
    c_int, 
    byref, 
) 


class noPDDE(Structure): 
    pass 

noPDDE._fields_ = [ 
    ("x", c_void_p), 
    ("y", POINTER(noPDDE)), 
    ("z", POINTER(noPDDE)), 
    ] 


class PDDE(Structure): 
    _fields_ = [ 
     ("tam", c_int), 
     ("sup", POINTER(noPDDE)), 
     ] 



foo = PDDE() 

mylib.func_that_takes_pointer_to_pdde(byref(foo)) 
+0

我完全按照你的寫法做了,但仍然在這裏失蹤。第一個錯誤是「無法導入void_p」,所以我使用了(「x」,c_void_p)。好。 現在,它告訴我,在PDDE類_fields_上的第二個元素必須是ac類型... –

+0

我犯了一個錯誤,因爲我顯然不能運行你的代碼,因爲缺乏你那個怪異的庫,糾正它。但是,您需要自己弄清楚類似的事情,錯誤消息非常清晰,以及ctypes-Structure上的文檔。 – deets

+0

好的,非常感謝你@deets!我不知道如何聲明遞歸結構。 –