2017-10-12 63 views
0

按照GSL文档的签名是:与GSL使用ctypes的传递阵列

double gsl_stats_correlation (const double data1[], 
           const size_t stride1, 
           const double data2[], 
           const size_t stride2, 
           const size_t n) 

当我尝试从PyPy与调用它:

from ctypes import CDLL, RTLD_GLOBAL 
gslcblas = CDLL('libgslcblas.0.dylib',mode=RTLD_GLOBAL) 
libgsl = CDLL('/usr/local/lib/libgsl.0.dylib') 
from ctypes import c_double, c_size_t, pointer 
a1 = (c_double * 5)(1, 2, 3, 4, 5) 
a2 = (c_double * 5)(1, 2, 3, 6, 5) 
print(libgsl.gsl_stats_correlation(a1, c_size_t(1), 
     a2, c_size_t(1), c_size_t(5))) 

结果我的机器上目前为1086463496,尽管它从跑步变为跑步。这显然是不正确的。我究竟做错了什么?请注意,将函数调用更改为:

libgsl.gsl_stats_correlation(pointer(a1), c_size_t(1), 
          pointer(a2), c_size_t(1), c_size_t(5))) 

给出完全相同的结果。

回答

0

您需要设置功能的restype这样的:

libgsl.gsl_stats_correlation.restype = c_double 

看一看this ctypes的教程(尤其this section),了解正确指定的参数和响应类型。