I tried to make a grid-based program in C++. But each time I run it, I get the same error (Show in title). I know it is quite a common error but after reading carefully through the code, I wasn't able to spot any mistake:
#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);
}
}
So, when I Start the program it prints out the whole grid as it is supposed to do. But when it gets to the point where gN = step(...);
I get an error. But I was able to spot that it has something to do with the return gN;
statement of the swap() function.
thx for helping
You're trying to test out-of-bounds conditions inside getNeighboursCount()
, but you are not doing it completely right. In lines
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;};};
each test for overflow (e.g. x < g.size()
) is incorrect. The getNeighbourghsCount()
method never gets called with an x
that would not satisfy the condition, x
is always smaller than the size of the container, because it's 0 based indexed. One way to fix it would be to change the condition to x < g.size() - 1
There are other problems, e.g. g[x-1][y+1 == 1]
is certainly a typo. But this might get you started...
User contributions licensed under CC BY-SA 3.0