C++;:是什么导致此堆栈粉碎错误? 免责声明:我对C++的知识有限,因为他们从一个没有教C++的大学转到另一个只有教过的语言。
我正在尝试为54x54的晶格中随机生成的2D簇实现盒计数方法 其中一个要求是,我们使用1D数组来表示2D方形晶格,因此需要进行转换以将x和y值(分别为列和线)关联到数组的实际位置。 变换为“i=x+y*N”,其中N是正方形晶格边的长度(在本例中,它将是54),i是阵列的位置 简单地说,盒计数方法包括将网格分割成逐渐变小的大正方形,并计算每个实例中包含集群的数量。 对于较小的晶格尺寸,至少对于我可以验证的晶格尺寸,代码的工作方式应该是这样的(由于明显的原因,我甚至无法手动验证10x10晶格)。但是,当我运行它时,长方体大小一直到1/37,并给我一个“stack smashing detected”错误 据我所知,错误可能与数组大小有关,但我已检查了访问数组的点,并确保它们在数组的实际尺寸范围内 函数“boxTransform(intgrid[],intnnew,intdiv)”中的“for”是导致上述错误的原因,但我添加了我认为与此相关的其他函数。 代码的其余部分只是定义一个晶格并隔离聚合,然后将聚合传递给boxCounting(intGrid[]),并创建一个.dat文件。这些很好用 为了将较大的数组“拟合”为较小的数组,我将每个坐标(x,y)除以大数组与小数组上的平方比。我的老师就是这样解释的,正如前面所提到的,对于较小的数组大小来说效果很好 编辑:多亏了VTT的评论,我回去检查数组索引是否超出了代码本身的范围。事实确实如此,这可能是问题的根源 编辑2:这确实是问题的根源。对于较小的晶格尺寸,计算中出现了一个轻微的错误(或者我错过了)C++;:是什么导致此堆栈粉碎错误? 免责声明:我对C++的知识有限,因为他们从一个没有教C++的大学转到另一个只有教过的语言。,c++,arrays,C++,Arrays,我正在尝试为54x54的晶格中随机生成的2D簇实现盒计数方法 其中一个要求是,我们使用1D数组来表示2D方形晶格,因此需要进行转换以将x和y值(分别为列和线)关联到数组的实际位置。 变换为“i=x+y*N”,其中N是正方形晶格边的长度(在本例中,它将是54),i是阵列的位置 简单地说,盒计数方法包括将网格分割成逐渐变小的大正方形,并计算每个实例中包含集群的数量。 对于较小的晶格尺寸,至少对于我可以验证的晶格尺寸,代码的工作方式应该是这样的(由于明显的原因,我甚至无法手动验证10x10晶格)。但是
//grid[]是包含集群的数组
//我想分析一下。
空盒计数(整数网格[]){
//N是一个全局常数;它是
//正在分析的正方形晶格的一侧。
//NNew是较大正方形的边。它将
//增加到N
对于(int-NNew=1;N-NNew>0;NNew++){
int div=N/NNew;
boxTransform(栅格、NNew、div);
}
}
void-boxTransform(int-grid[],int-NNew,int-div){
int gridNew[NNew*NNew];
//这里数组元素设置为零,这
我理解C++不能天生做。
对于(int i=0;i0)box++;
}
退货箱;
}
不幸的是,这些信息不足以为您找到确切的问题,但我会尽力提供帮助
除了练习中需要使用动态数组外,您应该使用动态数组而不是正在使用的固定大小数组,这有多种原因。
如果你一直在学习其他语言,你可能会认为固定数组是足够好的,但是它在C++中比大多数语言更危险。
int gridNew[NNew*NNew]代码>你应该知道这是不符合C++标准的,只有GCC编译器才能工作。在C++中,编译时总是需要知道固定数组的大小。这意味着您不能使用变量来声明数组
size()
成员函数查询向量的长度
更好的是:您可以使用at()
函数而不是方括号([]
)来获取和元素,该索引为您执行边界检查,如果您提供了一个超出边界的索引,则会引发异常,这有助于定位此类错误。因为在C++中,如果只提供一个数组中不存在的索引,则它是一个未定义的行为,这可能是您的问题。
我不想再写向量的任何特性了,因为很容易找到关于如何做这些事情的示例,我只是想帮助您从哪里开始。不幸的是,这些信息不足以找到确切的问题f
//grid[] is an array containing the cluster
//that I want to analyze.
void boxCounting(int grid[]) {
//N is a global constant; it's the length of the
//side of the square lattice that's being analyzed.
//NNew is the side of the larger squares. It will
//be increased until it reaches N
for (int NNew = 1; N - NNew > 0; NNew++) {
int div = N/NNew;
boxTransform(grid, NNew, div);
}
}
void boxTransform(int grid[], int NNew, int div) {
int gridNew[NNew*NNew];
//Here the array elements are set to zero, which
//I understand C++ cannot do natively
for (int i = 0; i < NNew*NNew; i++) {
gridNew[i] = 0;
}
for (int row = 0; row < N; row++) {
for (int col = 0; col < N; col++) {
if (grid[col + row*N] == 1) {
//This is where the error occurs. The idea here is
//that if a square on the initial grid is occupied,
//the corresponding square on the new grid will have
//its value increased by 1, so I can later check
//how many squares on the larger grid are occupied
gridNew[col/div + (row/div)*NNew]++;
}
}
}
int boxes = countBox(gridNew, NNew);
//Creates a .dat file with the relevant values
printResult(boxes, NNew);
}
int countBox(int grid[], int NNew) {
int boxes = 0;
//Any array values that weren't touched remain at zero,
//so I just have to check that it's greater than zero
//to know if the square is occupied or not
for(int i = 0; i < NNew*NNew; i++) {
if(grid[i] > 0) boxes++;
}
return boxes;
}