2010-08-03 58 views
3

我正在編寫一些python代碼來與廣泛使用結構的C DLL進行交互。如何在Python中使用ctypes模擬動態調整大小的C結構

其中一個結構包含嵌套結構。我知道這對ctypes模塊不是問題。問題是有一個經常使用的結構,在C中,它是通過宏定義的,因爲它包含一個可以變化的「靜態」長度數組。這是令人困惑所以這裏的一些代碼

struct VarHdr { 
    int size; 
} 

#define VAR(size) \ 
    struct Var { 
     VarHdr hdr; 
     unsigned char Array[(size)]; 
    } 

那麼在其他結構中使用這樣的

struct MySruct { 
    int foo; 
    VAR(20) stuffArray; 
} 

的問題就變成了我如何可以模擬這個在Python的方式,所產生的結構可在我的pythong腳本和DLL之間來回傳遞。

順便說一句,我知道我可以在那裏硬編碼的數字,但這個「VAR」有幾個實例有不同的大小。

回答

4

只要知道尺寸就可以使用工廠來定義結構。

http://docs.python.org/library/ctypes.html#variable-sized-data-types

使用可變大小的數據類型 與ctypes的另一種方法是使用Python的 動態特性,並 (重新)定義數據類型後 所需尺寸是已知,在 個案的基礎上。

(未測試)實施例:

def define_var_hdr(size): 
    class Var(Structure): 
     fields = [("size", c_int), 
       ("Array", c_ubyte * size)] 

    return Var 

var_class_10 = define_var_hdr(10) 
var_class_20 = define_var_hdr(20) 
var_instance_10 = var_class_10() 
var_instance_20 = var_class_20() 
+0

做得好。謝謝。 – Karim 2010-08-03 21:05:25

相關問題