C 阵列二维到一维的转换和混淆

C 阵列二维到一维的转换和混淆,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,我对将二维数组转换为一维数组感到困惑。 我想为“a11”(在(1,1)处)编写一个相邻的8个元素,格式为width、rows和cols,而不使用for循环 |<--Width--->| cols ____________ | a00 a01 a02 rows | a10 a11 a12 | a20 a21 a22 但是我想我犯了一些错误。有人能帮我吗。由于没有显示它的定义,所以不清楚pSrc

我对将二维数组转换为一维数组感到困惑。 我想为“a11”(在(1,1)处)编写一个相邻的8个元素,格式为width、rows和cols,而不使用for循环

       |<--Width--->|
            cols
        ____________
       | a00 a01 a02 
  rows | a10 a11 a12 
       | a20 a21 a22 

但是我想我犯了一些错误。有人能帮我吗。

由于没有显示它的定义,所以不清楚
pSrc
是如何定义的。但是,您的代码与声明为1D数组的代码一致:

int pSrc[9];   // Or a larger dimension
您的代码可以合理编写,因此布局更加统一:

a00 = pSrc[(cols-1) + (rows-1)*width];
a01 = pSrc[(cols-1) + (rows+0)*width];
a02 = pSrc[(cols-1) + (rows+1)*width];
a10 = pSrc[(cols+0) + (rows-1)*width];
a12 = pSrc[(cols+0) + (rows+1)*width];
a20 = pSrc[(cols+1) + (rows-1)*width];
a21 = pSrc[(cols+1) + (rows+0)*width];
a22 = pSrc[(cols+1) + (rows+1)*width];
即使是最简单的编译器也会忽略
+0
,几乎可以肯定,甚至不用打开优化器,但它使代码更易于阅读。我也重新排序了条目,所以上面的行首先列出,然后在中间行,然后是底部行。同样,它使模式更容易查看

很明显,您使用的是“rows”和“cols”。您实际上需要:

a00 = pSrc[(cols-1) + (rows-1)*width];
a01 = pSrc[(cols+0) + (rows-1)*width];
a02 = pSrc[(cols+1) + (rows-1)*width];
a10 = pSrc[(cols-1) + (rows+0)*width];
a12 = pSrc[(cols+1) + (rows+0)*width];
a20 = pSrc[(cols-1) + (rows+1)*width];
a21 = pSrc[(cols+0) + (rows+1)*width];
a22 = pSrc[(cols+1) + (rows+1)*width];

请参考
a[i][j]=*(*(a+i)+j)
。我不想使用For循环,因为我正在OpenCL中编写代码。我正在用内核代码替换For循环。你能用我提到的上述格式给出你的答案吗
pSrc
是如何定义的?对于您的示例案例,
cols
是否设置为
1
(以及
rows
是否设置为
1
)?是..行和cols设置为1..并且psrc是全局uchar*psrc
a00 = pSrc[(cols-1) + (rows-1)*width];
a01 = pSrc[(cols+0) + (rows-1)*width];
a02 = pSrc[(cols+1) + (rows-1)*width];
a10 = pSrc[(cols-1) + (rows+0)*width];
a12 = pSrc[(cols+1) + (rows+0)*width];
a20 = pSrc[(cols-1) + (rows+1)*width];
a21 = pSrc[(cols+0) + (rows+1)*width];
a22 = pSrc[(cols+1) + (rows+1)*width];