2017-10-12 6 views
0

Selon la documentation GSL, la signature est:Utilisation ctypes avec GSL pour passer ensemble

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

Lorsque je tente de l'appeler de PyPy avec:

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

Le résultat sur ma machine est 1086463496 en ce moment, même si elle change d'une course à l'autre. C'est évidemment loin d'être correct. Qu'est-ce que je fais mal? Notez que le changement de l'appel de la fonction à:

donne exactement le même résultat.

Répondre

0

Vous devez régler la restype de la fonction comme ceci:

libgsl.gsl_stats_correlation.restype = c_double 

Jetez un oeil à this ctypes tutoriel (en particulier this section) à lire sur la spécification des types d'arguments et de réponse correctement.