Cython中的int **和int *类型

1 投票
1 回答
1208 浏览
提问于 2025-04-18 09:37

我正在尝试用Cython来封装一些C代码,但遇到了一个我不理解的错误。尽管我搜索了很多资料,还是找不到相关的信息。以下是我的C代码:

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,错误信息是:

无法将类型'int **'赋值给类型'int *'

你能告诉我该怎么解决这个问题吗?

Roy Roth

1 个回答

4

问题出在这里:

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)

你把 info 声明为 int* 类型。但你在把它传递给 cssor 函数时,实际上是把它当成了一个 int* 的引用,这样就变成了 int**

正确的代码是:

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

撰写回答