2014-04-08 2 views
1

나는 cffi를 사용하는 법을 배우려고 노력하고있다. 그러나 나는 C에 상당히 익숙하기 때문에 조금 까다 롭다. 나는 두 배의 배열의 합을 계산하는 간단한 함수로 연습하고있다. 이상하게도 내 합계 함수가 올바른 출력을 제공하지 않습니다. 왜 누군가는 볼 수 있습니까? 어레이를 올바르게 취급합니까? 내가 numpy 배열을 포인터로 던져야하는 이유를 이해하지 못한다.Python PYPY Numpy 배열이있는 Cffi

from cffi import FFI 
import numpy as np 

ffi = FFI() 
ffi.cdef(""" 
double sum(double[], int); 
""") 
C = ffi.verify(""" 
double sum(double numbers[],int num_elements){ 
    int i, sum=0.0; 
    for (i=0; i<num_elements; i++) 
    { 
    sum = sum + numbers[i]; 
    } 
    return(sum); 
} 
""") 
numbers = np.random.gamma(1,1,100) 
print 'numpy', sum(numbers) 

numbers_p = ffi.cast('double *',numbers.ctypes.data) 
sm = C.sum(numbers_p, len(numbers)) 

print 'cffi', sm 

출력 : 결과가 좋은 평판 정수 얼마나

numpy 119.436940423 
cffi 80.0 

답변

3

알 수 있습니다.

C 코드가 잘못되었습니다. 합계에 올바른 유형을 지정해야합니다.

변경 제안 : 그 보정

C = ffi.verify(""" 
double sum(double numbers[],int num_elements){ 
    int i; 
    double sum=0.0; //Now it has the correct data type. 
    for (i=0; i<num_elements; i++) 
    { 
    sum = sum + numbers[i]; 
    } 
    return(sum); 
} 
""") 

:

>>> sm = C.sum(numbers_p, len(numbers)) 
>>> sm 
98.53688973595715 
>>> sum(numbers) 
98.536889735957146 
>>> sum(numbers) == sm 
True