使用带有GSL的ctypes传递数组

时间:2017-10-12 01:36:00

标签: python ctypes gal

根据GSL文件,签名是:

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)))

给出完全相同的结果。

1 个答案:

答案 0 :(得分:1)

您需要设置此功能的restype

libgsl.gsl_stats_correlation.restype = c_double

查看this ctypes教程(特别是this section),了解如何正确指定参数和响应类型。