2017-10-12 104 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),瞭解正確指定的參數和響應類型。