除了常规项之外, PIL 风格的数组还可以包含指针,必须跟随这些指针才能到达维度的下一个元素。例如,常规的三维 C 语言数组 char v[2][2][3] 可以看作是一个指向 2 个二维数组的 2 个指针:char (*v[2])[2][3]。在子偏移表示中,这两个指针可以嵌入在 buf 的开头,指向两个可以位于内存任何位置的 char x[2][3] 数组。
这是一个函数,当n维索引所指向的N-D数组中有 NULL 步长和子偏移量时,它返回一个指针
void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,
Py_ssize_t *suboffsets, Py_ssize_t *indices) {
char *pointer = (char*)buf;
int i;
for (i = 0; i < ndim; i++) {
pointer += strides * indices;
if (suboffsets >=0 ) {
pointer = *((char**)pointer) + suboffsets;
}
}
return (void*)pointer;
} |