【发布时间】:2017-11-03 19:57:08
【问题描述】:
我正在拼命地尝试编写一个包装器来调用一个 C 函数:
- 以多个多维C连续数组作为输入
- 在 C 例程中使用数组来执行一些操作
在我附加的代码中,我放置了 2 个我试图从 python 访问的函数。第一个函数SurfInfo 调用C 函数PosAndTgtSurfVec,这个函数按预期工作。为了使它工作,我使用了this tutorial。
问题在于调用 C 函数 SurfToSurf 的第二个包装函数 Surf2Surf。
请注意,我不能修改 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)
# ---------------------------------------------------------#
编译错误是:
SurfToSurf(v, &X[0,0], &u[0,0], &t1[0,0], &t2[0,0], &a[0], &b[0], &hFG[0],h, R,K)
^
------------------------------------------------------------
wrp.pyx:54:18: Cannot assign type 'double *' to 'double (*)[12]'
如何提供所需的类型?我认为像在第一种情况下那样提供数组第一个元素的地址会起作用。 如果问题很愚蠢,我很抱歉,如果您可以将我重定向到可以帮助我解决问题的文档或示例,我会很高兴(我已经检查了this link 和this book,但我肯定错过了那里的答案) 我暂时不找演出。
【问题讨论】:
-
虽然指针可以被视为一维数组,但二维数组却不是这样。它不知道一行中有多少个元素来知道它需要偏移多少才能索引每一行。编辑:我看到您正在尝试将指针作为二维数组传递,而不是人们通常绊倒的其他方式。
-
@MacroMag 我删除了我的答案 - 它适用于定义为采用
double**的函数,但事实证明我并不像我想的那样理解 2D C 数组,所以它不是不适合那些。很抱歉造成误导。恐怕我不知道正确的答案。 -
@MarcoMag 查看编辑 - 这个版本确实有效...
标签: python c arrays numpy cython