使用带有 GSL 的 ctypes 来传递数组
Using ctypes with GSL to pass array
根据 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)))
给出完全相同的结果。
您需要像这样设置函数的 restype
:
libgsl.gsl_stats_correlation.restype = c_double
查看 this ctypes tutorial (particularly this section) 以了解如何正确指定参数和响应类型。
根据 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)))
给出完全相同的结果。
您需要像这样设置函数的 restype
:
libgsl.gsl_stats_correlation.restype = c_double
查看 this ctypes tutorial (particularly this section) 以了解如何正确指定参数和响应类型。