C++ 使用单个循环在二维阵列上循环
我有一个定义为C++ 使用单个循环在二维阵列上循环,c++,language-lawyer,C++,Language Lawyer,我有一个定义为双垫[6][6]的二维数组。为了让gcc矢量化for,我需要使用一个循环。我有以下循环: double* p = &mat[0][0]; for (int i = 0; i < 36; i++) sum += p[i] + 48; double*p=&mat[0][0]; 对于(int i=0;i
双垫[6][6]
的二维数组。为了让gcc矢量化for,我需要使用一个循环。我有以下循环:
double* p = &mat[0][0];
for (int i = 0; i < 36; i++)
sum += p[i] + 48;
double*p=&mat[0][0];
对于(int i=0;i<36;i++)
总和+=p[i]+48;
gcc警告我:数组下标高于数组边界。为什么?没有直接回答您的问题,但作为替代方案,您可以使用
mod
和div
确定各个维度的索引(只要是二维的):
int height = 6;
int width = 6;
for (int i = 0; i < 36; i++)
{
sum = mat[i / height][i % width] + 48;
}
int高度=6;
整数宽度=6;
对于(int i=0;i<36;i++)
{
总和=材料[i/高度][i%宽度]+48;
}
不回答您的问题,但您可以通过以下方式解析mat:
for(int i=0, j=0; i < 6; (++j < 6) ? (j):(++i,j=0))
{
sum += mat[i][j] + 48;
}
for(int i=0,j=0;i<6;(++j<6)?(j):(++i,j=0))
{
总和+=mat[i][j]+48;
}
最好的办法是使用指针。由于要使用单个循环,因此需要使用不同的逻辑。首先发布答案:
因此代码的工作原理如下所示:
*(*(p+int(i/6))+i%6)
oni=0
给出了*(*(p+0)+0)
*(*(p+int(i/6))+i%6)
oni=1
给出了*(*(p+0)+1)
*(*(p+int(i/6))+i%6)
oni=2
给出了*(*(p+0)+2)
循环上升到
i=35
是的,当然,但我正试图减少对mat double[outer][inner]
的操作,应该是mat[i/inner][i%inner]
注意//code>和%
的操作非常昂贵,即使你使用一个奇特的函数将它们组合在一起。重复?上周只有一个回答说这是UB,并有一些很好的标准引用。我现在正试图找到它。对于类似的情况,我曾经使用过union{double mat[4][4];double value[16];}代码>(可能是,一些<代码> Advestor()/代码> s让我睡得更好。)GryWordF82:虽然这也是UB,但在C++中,不能通过<代码>联合<代码>键入双关语。最简单和最健壮的解决方案可能是坚持一维数组来存储。2D访问可以通过一个执行div/mod的小函数来完成。(或封装在类中以粘合在一起。)
double* p = &mat[0][0];
for (int i = 0; i < 36; i++)
sum += *(*(p+ int(i/6)) + i%6)+ 48;
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]