Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;:是什么导致此堆栈粉碎错误? 免责声明:我对C++的知识有限,因为他们从一个没有教C++的大学转到另一个只有教过的语言。_C++_Arrays - Fatal编程技术网

C++;:是什么导致此堆栈粉碎错误? 免责声明:我对C++的知识有限,因为他们从一个没有教C++的大学转到另一个只有教过的语言。

C++;:是什么导致此堆栈粉碎错误? 免责声明:我对C++的知识有限,因为他们从一个没有教C++的大学转到另一个只有教过的语言。,c++,arrays,C++,Arrays,我正在尝试为54x54的晶格中随机生成的2D簇实现盒计数方法 其中一个要求是,我们使用1D数组来表示2D方形晶格,因此需要进行转换以将x和y值(分别为列和线)关联到数组的实际位置。 变换为“i=x+y*N”,其中N是正方形晶格边的长度(在本例中,它将是54),i是阵列的位置 简单地说,盒计数方法包括将网格分割成逐渐变小的大正方形,并计算每个实例中包含集群的数量。 对于较小的晶格尺寸,至少对于我可以验证的晶格尺寸,代码的工作方式应该是这样的(由于明显的原因,我甚至无法手动验证10x10晶格)。但是

我正在尝试为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:这确实是问题的根源。对于较小的晶格尺寸,计算中出现了一个轻微的错误(或者我错过了)

//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++中,编译时总是需要知道固定数组的大小。这意味着您不能使用变量来声明数组

  • 您不断更新全局变量以跟踪数组的大小,这使得代码非常难以读取。您这样做可能是因为您知道一旦将数组传递给函数,就无法查询数组的大小

  • 对于这两个问题,动态数组是完美的解决方案。C++中标准的动态数组实现是STD::vector:

    创建向量时,可以定义其大小,也可以使用
    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;
    }