数组2D到1D的转换和混淆

时间:2014-09-30 04:25:23

标签: c arrays multidimensional-array

我很困惑将2D数组转换为1D数组。 我想以宽度,行和列格式的形式为“a11”(在(1,1)处)写一个相邻的8个元素,而不使用for循环。

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

我试过这样的方式:

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

但我认为我犯了一些错误。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:2)

由于您没有显示其定义,因此不清楚pSrc的定义方式。但是,您的代码与声明为一维数组的代码一致:

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,几乎可以肯定甚至没有打开优化器,但它使代码更容易阅读。我还重新排序了条目,因此首先列出上面的行,然后是中间的行,然后是最后一行。同样,它可以更容易地看到模式。

很明显,您正在使用&#39;行&#39;和&#39; cols&#39;向后。你真的需要:

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];