小编Sai*_*iph的帖子

如何访问具有多个括号的一维数组以提高可读性?

我有一个巨大的代码使用由指针管理的3D数组.就像是:

int *** tab;
tab = malloc(m*sizeof(int**));
for(i= 1..n) tab[i] = malloc(n*sizeof(int*));  
... etc...
Run Code Online (Sandbox Code Playgroud)

然后使用以下方法访问元素:

tab[i][j][k] = ...
Run Code Online (Sandbox Code Playgroud)

但由于此结构的特定问题,我想将tab声明为连续数组,但仍然在代码中使用带有3个括号的语法.编译器将在内部替换它们,如下所示:

tab[i][j][k] = ...  =>  tab[i*m*n+j*m+k] = ...
Run Code Online (Sandbox Code Playgroud)

因此只使用一个指针解引用访问该数组.我不想更改源代码(没有sed).

例如,我可以通过在堆栈中声明制表符来完成此操作:

int tab[n][m][l];
Run Code Online (Sandbox Code Playgroud)

但不幸的是,如果m并且n是运行时变量,这不起作用.

c c++ multidimensional-array square-bracket c-preprocessor

9
推荐指数
2
解决办法
774
查看次数

当数组大小均匀时,为什么这段代码会变慢?

警告:实际上它不是由于2的幂而是奇偶校验.请参阅编辑部分.


我找到了一个显示相当奇怪行为的代码.

代码使用2D数组(大小x大小).当size为2的幂时,代码的速度在10%到40%之间,最慢的是size = 32.

我用英特尔编译器获得了这些结果.如果我使用gcc 5.4编译,2问题的能力消失但代码慢3倍.在不同的CPU上测试它,我认为它应该足够可重复.

码:

#define N 10000000

unsigned int tab1[TS][TS];

void simul1() {

  for(int i=0; i<TS; i++)
  for(int j=0; j<TS; j++) {

    if(i > 0)
      tab1[i][j] += tab1[i-1][j];

    if(j > 0)
      tab1[i][j] += tab1[i][j-1];
  }
}

int main() {

  for(int i=0; i<TS; i++)
  for(int j=0; j<TS; j++)
    tab1[j][i] = 0;


  for(int i=0; i<N; i++) {
    tab1[0][0] = 1;
    simul1();
  }

  return tab1[10][10];
}
Run Code Online (Sandbox Code Playgroud)

汇编:

icc:
        icc main.c -O3 -std=c99 -Wall -DTS=31 -o …
Run Code Online (Sandbox Code Playgroud)

c optimization performance gcc icc

6
推荐指数
2
解决办法
261
查看次数

如何从OpenCV for Android中的每个轮廓中提取线条?

我想检查每个Canny检测到的边缘并查找其中的主线(检查它们是否看起来形成一个矩形,例如,如果2对线是平行的等等).

Imgproc.HoughLinesP做我想要的,但它给出了整个图像的线条,我想知道哪些线条来自相同的边缘.

我也尝试使用FindContours,并使用approxPolyDP在每个轮廓中寻找主线,但这看起来并不适合,因为Canny检测到的边缘经常存在间隙.这给出了边缘的轮廓而不是边缘本身.

这是一个测试图像示例:

在此输入图像描述

在此输入图像描述

如何为每个形状获得一组线?

android opencv

5
推荐指数
1
解决办法
1542
查看次数