есть ли способ проверить, существует ли точка в массиве - PullRequest
0 голосов
/ 07 августа 2020

Я делаю код игры жизни Конвея. Я использую функцию для проверки всех ячеек, окружающих каждую живую ячейку, и запоминаю, сколько раз они появляются. Я сохраняю результаты в двумерном массиве под названием Surroundlist.

void updateAlive(){
int surroundlist[sizeX][sizeY],i,j;

for (j=0; j<sizeY; ++j){
 for (i=0; i<sizeX; ++i){
  surroundlist[i][j]=0;
 }
}

for (i=0; i<alivecells; ++i){

++surroundlist[(alive[i].Xcoord-1)][(alive[i].Ycoord-1)];
++surroundlist[(alive[i].Xcoord)][(alive[i].Ycoord-1)];
++surroundlist[(alive[i].Xcoord+1)][(alive[i].Ycoord-1)];

++surroundlist[(alive[i].Xcoord-1)][(alive[i].Ycoord)];
++surroundlist[(alive[i].Xcoord+1)][(alive[i].Ycoord)];

++surroundlist[(alive[i].Xcoord-1)][(alive[i].Ycoord+1)];
++surroundlist[(alive[i].Xcoord)][(alive[i].Ycoord+1)];
++surroundlist[(alive[i].Xcoord+1)][(alive[i].Ycoord+1)];
}

}

alive - это структура, содержащая координаты x и y каждой живой ячейки, показанные здесь:

typedef struct {//structure contains all alive cells
 int Xcoord;//x coord of alive cell
 int Ycoord;//y coord of alive cell
} point; 
point alive[sizeX * sizeY - 1];

this функция работает нормально, если координата живой ячейки не находится на краю, например (0,0). В этом случае программа обычно выдает ошибку с ошибкой сегментации, поскольку она пытается поместить значение в несуществующую ячейку.

есть ли функция, которая может использоваться для проверки наличия ячейки в массив, который я могу использовать перед обновлением каждой окружающей ячейки, чтобы проверить, существует ли она?

1 Ответ

2 голосов
/ 07 августа 2020

эта функция работает нормально

нет, на границах вы учитываете несмежные ячейки, размещенные на противоположной следующей / предыдущей строке

... если только координата живой ячейки находится на краю, например (0,0)

вы пишете из Surroundlist , когда alive для точки на первая и последняя строка

есть ли функция, которую можно использовать для проверки наличия ячейки в массиве, который я могу использовать перед обновлением каждой окружающей ячейки, чтобы проверить, существует ли она?

вам нужно проверить, можете ли вы рассматривать ячейку каждый раз, когда вы добавляете / удаляете 1 в координате, или вам нужно делать особый случай для границ. Другой способ - разместить прямоугольник с центром в прямоугольнике, имеющем еще две строки и столбцы, и никогда не помещать живой элемент в эти дополнительные строки / столбцы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...