2013-08-23 251 views
1

在我的C代碼,我有:ctypes的 - 通過一個結構的指針另一個結構

typedef struct{ 
    int info1; 
    int info2; 
    MoreData* md; 
} BasicData; 

typedef struct{ 
    int extinfo[100]; 
    char stuff[100]; 
} MoreData; 

現在我有一個C庫函數,它接受BasicData作爲參數,我想從Python中調用它。 要做到這一點,我構建一個ctypes類:

class BasicData(Structure): 
    _fields_ = [("info1", c_int), 
       ("info2", c_int), 
       ("md", ??????)] 

我的問題是我該怎麼填進????空間能夠將這個結構傳遞給C函數(或者我需要完全不同的東西?)。 MoreData僅用於計算,我不需要在Python代碼中讀取它,因此爲它分配內存將從C庫級別處理。我只需要傳遞正確的指針類型的BasicData結構。

回答

2

如果您不需要分配或使用MoreData結構,那麼就ctypes而言,md只是一個通用指針。使用void * - 即c_void_p

1

您需要定義一個class MoreData(Structure)包裝其他結構。然後通過,作爲("md", POINTER(MoreData))。如果你真的不想從Python訪問md那麼你可以在_fields_(因爲它是最後一個)才能指定它。所以,如果你真的不想從Python訪問md那麼你可以不指定它在_fields_(因爲它是最後一個)。然後ctypes會相信你只有前兩個成員的結構。

Ctypes適合一次性訪問C結構,但如果你經常用Python綁定C代碼,那麼我真的會推薦你去看看Cython。

編輯:正如eryksun指出的那樣(微弱雙關),我忘了指針。

+1

我讀的問題是'BasicData'結構由ctypes分配並傳遞給一個函數。在那種情況下,它至少需要一個'c_void_p'。如果確實定義了'MoreData'結構,那麼該字段將是'(「md」,POINTER(MoreData))'。 – eryksun

+0

同意,取決於是否有任何C代碼訪問'md' – vbraun

相關問題