以下线程中的答案对我没有帮助,因为我有多维数组Passing memoryview to C function。
我有以下测试代码:
标题文件:
.topcorner{
position:absolute;
top:0;
right:-1px;
border-style: solid;
border-width:1px;
border-color:lightgray;
}
.textAreaStyle {
width: 50%;
height: 150px;
border-style: solid;
border-width:1px;
border-color:lightgray;
position: relative;
}
带C功能的文件
<div class="textAreaStyle" contenteditable id="preview">
<div onclick="selectAll('preview')" class="topcorner">Select All</div>
test text
</div>
Cython文件:
//cm.h
double per(double **marr,int rows,int cols);
错误消息:
//cm.c
#include <stdio.h>
double per(double **marr,int rows,int cols){
int i,j;
for (i=0;i<rows;i++){
for (j=0;j<cols;j++){
//Just update the array
marr[i][j] = (double)(i+1)*(j+1);
}
}
}
我已经读过类型化的内存视图是在Cython中处理Python数组的最现代的方法,但我不知道如何做到这一点。我在C中有一些数字配方,它们运行在动态制作的大型多维数组上。 我尝试做错了吗?
答案 0 :(得分:2)
内部存储器视图实际上存储为一维数组以及有关尺寸大小的一些信息。见http://docs.cython.org/src/userguide/memoryviews.html#brief-recap-on-c-fortran-and-strided-memory-layouts
(稍微注意一点,你可以使用具有“间接”维度的内存视图,它将事物存储为指针的指针。这只有在它们已经分配了类似内存的事物的视图时才有意义 - 例如,你在C中构建一个像2D那样的2D数组。你不会从(比如)numpy对象那里得到那些,所以我会忽略这个细节。
您将C更改为
// pass a 1D array, and then calculate where we should be looking in it
// based on the stride
double per(double *marr,int rows,int cols, int row_stride, int col_stride){
int i,j;
for (i=0;i<rows;i++){
for (j=0;j<cols;j++){
//Just update the array
marr[row_stride*i + col_stride*j] = (double)(i+1)(j+1);
}
}
}
Cython代码然后需要更改以传递大步(以字节存储,因此除以itemsize以获得C期望的“双打数量”的步幅),以及第一个元素的地址< / p>
// also update the cdef defintion for per...
per(&x[0,0],x.shape[0],x.shape[1],
x.strides[0]/x.itemsize,x.strides[1]/x.itemsize)