【问题标题】:Array 2D to 1D conversion and confusion数组 2D 到 1D 的转换和混淆
【发布时间】:2014-09-30 04:25:22
【问题描述】:

我很困惑将二维数组转换为一维数组。 我想以宽度、行和列格式的形式为“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];                                               

但我认为我犯了一些错误。谁能帮助我。

【问题讨论】:

  • 供您参考a[i][j] = *(*(a+ i) + j)
  • 我不想使用 for 循环,因为我正在 OpenCL 中编写代码。我正在用内核代码替换 for 循环。你能以我提到的上述格式给出答案
  • pSrc 是如何定义的?对于您的示例案例,cols 是否设置为 1rows 是否设置为 1)?
  • Yes..rows 和 cols 设置为 1 .. 并且 psrc 是全局 uchar *pSrc

标签: c arrays multidimensional-array


【解决方案1】:

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

很明显,您正在反向使用“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];

【讨论】:

    猜你喜欢
    • 2021-03-19
    • 2017-07-29
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2017-09-11
    • 1970-01-01
    • 2017-11-02
    相关资源
    最近更新 更多