2014-06-12 32 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