2014-06-12 75 views
0

我想用Cython打包一些C代码,但我遇到了一个我不明白的错误,尽管有很多搜索,但我似乎无法找到任何东西。这里是我的C代码Cython int **和int *类型

void cssor(double *U, int m, int n, double omega, double tol, int maxiters, int *info){ 
double maxerr, temp, lcf, rcf; 
int i, j, k; 
lcf = 1.0 - omega; 
rcf = 0.25 * omega; 
for (k =0; k < maxiters ; k ++){ 
    maxerr = 0.0; 
    for (j =1; j < n-1; j++) { 
     for (i =1; i < m-1; i++) { 
      temp = U[i*n+ j]; 
      U[i*n+j] = lcf * U[i*n+j] + rcf * (U[i*n+j-1] + U [i*n+j+1] + U [(i-1)*n + j] + U [(i+1)*n+j]); 
      maxerr = fmax(fabs(U[i*n+j] - temp), maxerr); 
     } 
    } 
    if(maxerr < tol){break;} 
} 
if (maxerr < tol) {*info =0;} 
else{*info =1;} 

}

我.pyx文件

cdef extern from "cssor.h": 
     void cssor(double *U, int m, int n, double omega, double tol, int maxiters, int *info) 

    cpdef cyssor(double[:, ::1] U, double omega, double tol, int maxiters, int *info): 
     cdef int n, m 
     m = U.shape[0] 
     n = U.shape[1] 
     cssor(&U[0, 0], m, n, omega, tol, maxiters, &info) 

然而,当我尝试运行相关的安装文件,我得到一个错误引用maxiters在最后代码的行,上面写着:

无法分配类型“诠释**”输入“诠释*”

你能告诉我如何解决这个问题吗?

罗伊·罗斯

+0

变化'&info'为'info'。 – univerio

+0

要回答这个问题,需要经过比重现问题所需的更多的代码。虽然你这次得到了答案,但如果你最小化你的例子,你很可能在未来得到更好的答案。 – Veedrac

回答

2

问题来自这里:

cpdef cyssor(double[:, ::1] U, double omega, double tol, int maxiters, int *info): 
    cdef int n, m 
    m = U.shape[0] 
    n = U.shape[1] 
    cssor(&U[0, 0], m, n, omega, tol, maxiters, &info) 

您声明infoint*类型。但是,您将其传递到cssor函数中作为对int*的引用,使其成为int**

正确的代码是:

cssor(&U[0, 0], m, n, omega, tol, maxiters, info) 
+0

优秀。完美的作品。谢谢。 – Roy