首页 > 解决方案 > 为什么我不能返回向量> (进程返回-1073741819 (0xC0000005))

问题描述

我试图用 C++ 制作一个基于网格的程序。但是每次我运行它时,我都会得到同样的错误(在标题中显示)。我知道这是一个很常见的错误,但在仔细阅读代码后,我无法发现任何错误:

#include <iostream>
#include <vector>

using namespace std;

using grid = vector<vector<int>>;

int getNeighboursCount(grid g,int x,int y)
{
    int nCount = 0;
    if(x > 0 && y > 0){if(g[x-1][y-1] == 1){++nCount;};};
    if(x > 0){if(g[x-1][y] == 1){++nCount;};};
    if(y > 0){if(g[x][y-1] == 1){++nCount;};};
    if(x < g.size() && y < g[x].size()){if(g[x+1][y+1] == 1){++nCount;};};
    if(x < g.size()){if(g[x+1][y] == 1){++nCount;};};
    if(y > g[x].size()){if(g[x][y+1] == 1){++nCount;};};
    if(x > 0 && y < g[x].size()){if(g[x-1][y+1 == 1]){++nCount;};};
    if(x < g.size() && y > 0){if(g[x+1][y-1] == 1){++nCount;};};
    return nCount;
}

grid testCell(grid g, grid gN, int x, int y)
{
    gN = g;
    auto nCount = getNeighboursCount(g, x, y);
    if(g[x][y] == 1) //1 == TRUE == alive
    {
        if(nCount == 3 || nCount == 2){gN[x][y] == 1;} //Keep status
        else
        {
            gN[x][y] = 0;
        }
    }
    else if(g[x][y] == 0)
    {
        if(nCount == 3){gN[x][y] = 1;}
        else {gN[x][y] == 0;};
    }
    return gN;
}

grid step(grid g, grid gN)
{
    for(int i = 0; i < g.size(); ++i)
    {
        for(int j = 0; j < g[i].size(); ++j)
        {
            gN = testCell(g, gN, i, j);
        }
    }
    // works fine till here...
    return gN;
}

int main()
{
    grid g =
    { ...
        // 40 times 40 grid of 0
    };
    output(g);
    string useless;
    grid gN = g;
    while(getline(cin, useless))
    {
        gN = step(g, gN);
        output(gN);
    }

}

因此,当我启动程序时,它会按预期打印出整个网格。gN = step(...);但是当它到达我得到错误的地步时。但我能够发现它与return gN;swap() 函数的语句有关。

谢谢帮助

标签: c++vectorreturnc++17

解决方案


您正在尝试测试内部的越界条件getNeighboursCount(),但您并没有完全正确。排队

    if(x < g.size() && y < g[x].size()){if(g[x+1][y+1] == 1){++nCount;};};
    if(x < g.size()){if(g[x+1][y] == 1){++nCount;};};
    if(y > g[x].size()){if(g[x][y+1] == 1){++nCount;};};
    if(x > 0 && y < g[x].size()){if(g[x-1][y+1 == 1]){++nCount;};};
    if(x < g.size() && y > 0){if(g[x+1][y-1] == 1){++nCount;};};

每个溢出测试(例如x < g.size())都不正确。该方法永远不会被不满足条件getNeighbourghsCount()的调用,总是小于容器的大小,因为它是基于 0 的索引。解决它的一种方法是将条件更改为xxx < g.size() - 1

还有其他问题,例如g[x-1][y+1 == 1]肯定是错字。但这可能会让你开始......


推荐阅读