2017-09-22 5 views
2

cython 코드에서 포인터 개념을 사용하는 데 어려움을 겪고 있습니다. 다음 예제는 내가하려고하는 단순화 된 버전입니다. 나는 함수 (분포 함수)를 입력 매개 변수로 공급하고자하는 함수 func을 가지고 있습니다. 분포에는 입력 변수로서 두 개의 포인터 벡터가 있습니다.'myFuncDef *'를 'void (*) (double *, double *)'에 할당 할 수 없습니다.

from cpython cimport array 
import cython 
import ctypes 
cimport numpy as np 

ctypedef void (*myFuncDef)(double *, double *) 
from cython.parallel import prange 
cdef void func(int* x, double* hx, void(*func)(double*, double*), int n): 
     def int i 
     for i from 0 <= i < n: 
      func[0](&x[i], &hx[i]) 
     return 

cpdef void Lognormal(double* u, 
        double* yu): 
     #evaluate log of normal distribution 
     yu=-u*u*0.5 
     return 

def foo(np.ndarray[ndim=1, dtype=np.float64_t] x, 
     np.ndarray[ndim=1, dtype=np.float64_t] hx, 
     myFuncDef distribution, int k): 
    cdef np.ndarray[ndim=1, dtype=np.float64_t] sp 
    cdef int num=len(x) 
    cdef int j 
    for j from 0 <= j <k: 
     func(&x[0],&hx[0],&distribution, num) 
     sp[j]=hx[0] 
    return sp 

그래서 foo 함수의 입력으로 Lognormal 기능을 사용하고 싶습니다.

Cannot assign type 'myFuncDef *' to 'void (*)(double *, double *)' 

내가이 버그를 해결하기 위해 어떤 제안에 대한 감사합니다 : 나는 다음과 같은 오류 메시지가 나타납니다.

+0

코드에 컴파일러 오류가 많으므로 작게 시작하여 다른 기능을 컴파일해야합니다. 'myFuncDef distribution'이 작동하지 않습니까? 멋진 ctypedef를 사용하지 말고 직접'void (* distribution) (double *, double *)'를 사용하십시오. 모든 것이 컴파일되면 다시 돌아가 통사론을 추가 할 수 있습니다. – ead

+0

제안 된 변경 사항과 함께 foo 함수를 컴파일 할 때 @ead이 오류가 발생합니다 : 파이썬 객체 인수를'void (*) (double *, double *)'형식으로 변환 할 수 없습니다. 이 버그를 수정 하시겠습니까? – Dalek

+0

그래서'foo'는 파이썬 함수가 될 수 없지만'cdef' 여야합니까? – ead

답변

2

포인터의 레이어가 너무 많습니다 (포인터의 경우 typedefs와 논쟁하기 위해 제기 된 표준 문제). 단지 &&distribution에서 삭제하십시오. 이미 원하는 함수 포인터입니다.

+0

답변 해 주셔서 감사합니다. 그 버그를 해결하지만'foo' 함수에 관한 새로운 에러 메시지는 다음과 같습니다 :'Python 객체 인자를 'myFuncDef'타입으로 변환 할 수 없습니다. 이 문제를 해결할 수있는 제안이 있으십니까? – Dalek

+0

오류를 생성하는 호출을 보지 않고 ... –

+0

'Cython 파일을 컴파일하는 중 오류가 발생했습니다 : def foo (np.ndarray [ndim = 1, dtype = np.float64_t] x, ) np.ndarray [ndim = 1, dtype = np.float64_t] hx, myFuncDef distribution, int k) :' – Dalek