2013-05-09 79 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个参数,我会想出一个桥接函数,将它们全部打包到一个适合函数目标参数列表结构的结构中,然后调用函数。然后在离开桥接功能的路上解开结果(如果有的话)。

当然,这是一个猜测到一定程度,使一些本是火试...