2013-05-09 33 views
0

我已經從第三方DLL加載函數。我已成功通過ctypes.windll.LoadLibrary訪問作爲圖書館入口點的函數。該函數有30個參數,包括許多二維數組。函數原型指定參數在大多數情況下通過引用傳遞。當我進行函數調用時,我得到一個返回碼,表示內部變量有問題,這讓我認爲我已經通過了錯誤的指針。 (這很模糊。)我的問題是,在什麼情況下我應該使用ctypes.byref作爲參考。例如,假設我有以下內容:Python,何時使用ctypes.byref作爲參考傳遞

double_matrix = (ctypes.c_double * 100) * 100 
my_array = double_matrix() 

我應該傳遞my_array還是ctypes.byref(my_array)?

my_string = ctypes.create_string_buffer("Hello world!") 

那麼使用types.create_string_buffer()創建的對象呢?如果需要傳遞引用,我應該傳遞my_string還是ctypes.byref(my_string)?

編輯:

我沒有該DLL的代碼。

函數原型看起來基本上是這樣的,除了每種類型大概有5或6個。 (char * input,int indicator,double(* dmatrix)[100] [100],int(* groups)[100]);

感謝

+1

WOHA,30個參數...如果代碼是你,你有沒有使用對象/結構考慮在傳遞參數之前將參數邏輯聚類? – 2013-05-09 23:18:20

+0

您能否向我們展示該函數的C原型,而不是試圖用英文來描述它? (或者,更好的是,向我們展示一個不需要30個參數的精簡版本...) – abarnert 2013-05-09 23:30:52

+0

我希望這是一個足夠好的函數描述。 – aetodd 2013-05-10 00:49:57

回答

0

一般來說,如果你的原型是這樣的:

int process(char *input, int indicator, double (*dmatrix)[100][100], int (*groups)[100]); 

那麼就可以大致認爲其值得嘗試以下

傳遞的參數如下: 輸入的參考 指標值 dmatrix參考文獻 參考文獻羣

一般來說,假設原型是一個c函數,並且您指的是python的ctypes;過程函數期望您傳遞以下參數的地址引用:輸入,dmatrix和組。 另一方面,指示變量作爲直接值傳遞。 當通過引用傳遞參數時,它通常意味着接收函數可以更改該值,並且無論做出什麼樣的更改,調用者都可以直接分析這些更改(因爲它們都共享相同的特定地址空間)。

如果我必須反覆傳遞30個參數,我會想出一個橋接函數,將它們全部打包到一個適合函數目標參數列表結構的結構中,然後調用函數。然後在離開橋接功能的路上解開結果(如果有的話)。

當然,這是一個猜測到一定程度,使一些本是火試...