我有一个定义为double mat[6][6]
的二维数组。为了让gcc向量化,我需要使用单个循环。我有以下循环:
double* p = &mat[0][0];
for (int i = 0; i < 36; i++)
sum += p[i] + 48;
我收到gcc的警告说:数组下标在数组边界之上。为什么呢?
答案 0 :(得分:2)
不直接回答您的问题,但作为替代方案,您可以使用mod
和div
来确定各个维度的索引(只要它是二维的),如下所示:
int height = 6;
int width = 6;
for (int i = 0; i < 36; i++)
{
sum = mat[i / height][i % width] + 48;
}
答案 1 :(得分:0)
没有回答你的问题,但你可以用这种方式解析你的问题:
for(int i=0, j=0; i < 6; (++j < 6) ? (j):(++i,j=0))
{
sum += mat[i][j] + 48;
}
答案 2 :(得分:0)
最好的选择是使用指针。由于您要使用单个循环,因此需要使用不同的逻辑。 首先发布回答 :
double* p = &mat[0][0];
for (int i = 0; i < 36; i++)
sum += *(*(p+ int(i/6)) + i%6)+ 48;
2D数组的指针在以下manner中起作用。考虑int matrix[3][3]
:
matrix => Points to base address of two-dimensional array.
Since array decays to pointer.
*(matrix) => Points to first row of two-dimensional array.
*(matrix + 0) => Points to first row of two-dimensional array.
*(matrix + 1) => Points to second row of two-dimensional array.
**matrix => Points to matrix[0][0]
*(*(matrix + 0)) => Points to matrix[0][0]
*(*(matrix + 0) + 0) => Points to matrix[0][0]
*(*matrix + 1) => Points to matrix[0][1]
*(*(matrix + 0) + 1) => Points to matrix[0][1]
*(*(matrix + 2) + 2) => Points to matrix[2][2]
所以代码的工作原理如下:
*(*(p+ int(i/6)) + i%6)
上的 i=0
提供了*(*(p+ 0) + 0)
*(*(p+ int(i/6)) + i%6)
上的 i=1
提供了*(*(p+ 0) + 1)
*(*(p+ int(i/6)) + i%6)
上的 i=2
提供了*(*(p+ 0) + 2)
并且循环上升到i=35
。