我正拼命地编写一个包装器来调用一个C函数:
在我所附的代码中,我放了两个我正在尝试从python访问的函数。第一个函数SurfInfo
,它调用C函数PosAndTgtSurfVec
,这个函数按预期工作。为了使它工作,我使用了this tutorial。
问题在于调用C函数Surf2Surf
的第二个包装函数SurfToSurf
。
注意,我不能修改C函数。在
代码如下:
import cython
cimport numpy as np
import numpy as np
from cython cimport view
from cpython cimport array
cdef extern void PosAndTgtSurfVec(double v[156],double X[18],double u[18]
,double t1[3],double t2[3],double (*a),double (*b),double (*xi),double (*theta)
,double s[3],double sxi[3],double stheta[3])
cdef extern void SurfToSurf(double v[5901],double X[2][12],double u[2][12]
,double t1[2][3],double t2[2][3],double a[2],double b[2],double hFG[4]
,double h[4],double R[24],double K[24][24])
# ---------------------------------------------------------#
# This one works !
def SurfInfo(
np.ndarray[np.double_t, ndim=1, mode="c"] X,
np.ndarray[np.double_t, ndim=1, mode="c"] u,
np.ndarray[np.double_t, ndim=1, mode="c"] t1,
np.ndarray[np.double_t, ndim=1, mode="c"] t2,
double a,
double b,
double xi,
double theta
):
# declarations of pure C variables
# used for output
cdef :
double v[156];
double s[3];
double sxi[3];
double stheta[3];
PosAndTgtSurfVec(v, &X[0], &u[0], &t1[0], &t2[0], &a, &b, &xi, &theta, s, sxi, stheta)
return s, sxi, stheta
# ---------------------------------------------------------#
# ---------------------------------------------------------#
# This one does not compile!
def Surf2Surf(
np.ndarray[double, ndim=2, mode="c"] X not None,
np.ndarray[double, ndim=2, mode="c"] u,
np.ndarray[double, ndim=2, mode="c"] t1,
np.ndarray[double, ndim=2, mode="c"] t2,
np.ndarray[double, ndim=1, mode="c"] a,
np.ndarray[double, ndim=1, mode="c"] b,
np.ndarray[double, ndim=1, mode="c"] hFG):
cdef double v[5901];
cdef double h[4];
cdef double R[24];
cdef double K[24][24];
SurfToSurf(v, &X[0,0], &u[0,0], &t1[0,0], &t2[0,0], &a[0], &b[0], &hFG[0],h, R,K)
return (h, R, K)
# ---------------------------------------------------------#
编译错误为:
^{pr2}$如何提供所需类型?我认为像第一个例子一样提供数组的第一个元素的地址是可行的。 如果这个问题是愚蠢的,我很抱歉,如果你能把我引向能帮助我解决问题的文档或示例(我已经检查了this link和this book,但我肯定错过了其中的答案) 我暂时不想找演出。在
第二次尝试。。。。在
2D C arrays like ^{} are apparently stored as an array of ^{}s (即convertible to a pointer to a ^{} )。因此它们在内存中实际上是连续的,因此应该与C-连续numpy数组兼容(就像传入的那些数组)。在
您只需执行强制转换,将numpy数组的第一个元素
double*
重新解释为指向double[12]
r的指针(强制转换永远不理想,因为它们通常可以隐藏逻辑错误,但我认为在这种情况下没有其他选择):我添加了一个
assert
来检查您的数组。没有如果一个太小的数组通过Python接口,那么您可能会有程序崩溃的风险。在相关问题 更多 >
编程相关推荐