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 *)'
내가이 버그를 해결하기 위해 어떤 제안에 대한 감사합니다 : 나는 다음과 같은 오류 메시지가 나타납니다.
코드에 컴파일러 오류가 많으므로 작게 시작하여 다른 기능을 컴파일해야합니다. 'myFuncDef distribution'이 작동하지 않습니까? 멋진 ctypedef를 사용하지 말고 직접'void (* distribution) (double *, double *)'를 사용하십시오. 모든 것이 컴파일되면 다시 돌아가 통사론을 추가 할 수 있습니다. – ead
제안 된 변경 사항과 함께 foo 함수를 컴파일 할 때 @ead이 오류가 발생합니다 : 파이썬 객체 인수를'void (*) (double *, double *)'형식으로 변환 할 수 없습니다. 이 버그를 수정 하시겠습니까? – Dalek
그래서'foo'는 파이썬 함수가 될 수 없지만'cdef' 여야합니까? – ead