В aPath::start()
, у вас есть:
openNodes[entranceX][entranceY][0] = 1;
openNodes[entranceX][entranceY][2] = 14;
openNodes[entranceX][entranceY][3] = euclidean(entranceX,
entranceY);
openNodes[entranceX][entranceY][3] =
openNodes[entranceX][entranceY][2] +
openNodes[entranceX][entranceY][3];
openNodes[entranceX][entranceY][4] = entranceX;
openNodes[entranceX][entranceY][5] = entranceY;
Почему для индекса [1]
нет значения? И почему вы присваиваете два разных значения для индекса [3]
? Кроме того, если честно, имена entranceX
и entranceY
слишком длинные для выполняемой ими работы; они делают код менее читабельным (хотя я уверен, что вам сказали использовать хорошие значащие имена). Для этих индексов массива я бы, вероятно, использовал бы x
и y
.
По коду:
//Check the 8 squares around
for(i = openX - 1; i <= openX + 1; i++)
for(j = openY - 1; j <= openY + 1; j++)
{
Я бы, вероятно, убедился, что ни i
, ни j
не приняли недопустимые значения с кодом, таким как:
//Check the 8 squares around (openX, openY)
int minX = max(openX - 1, 0);
int maxX = min(openX + 1, gridsize);
int minY = max(openY - 1, 0);
int maxY = min(openY + 1, gridsize);
for (i = minX; i <= maxX; i++)
for (j = minY; j <= maxY; j++)
{
Я не уверен, нужно ли вам явно проверять случай, когда i == openX && j == openY
(текущая ячейка); это не одна из 8 ячеек вокруг текущей ячейки (потому что является текущей ячейкой), но другие условия могут уже иметь дело с этим. Если нет:
if (i == openX && j == openY)
continue;
Замечу, что у нас нет определений openX
и openY
или ряда других нелокальных переменных. Это затрудняет определение того, являются ли они переменными-членами класса или какими-то глобальными переменными. Мы также не видим ни их инициализации, ни документации о том, что они представляют.
Самый вероятный источник проблем
В aPath::SearchLessOpen()
у вас есть:
if(openNodes[i][j][0] == 1)
{
if(openNodes[i][j][6] <= F)
{
F = openNodes[i][j][7];
Вы указали в своем описании, что подписки на openNodes
на последнем месте превышали 0..5; ваш код, тем не менее, обращается к подписчикам 6 и 7. Это может легко привести к путанице, которую вы описываете - вы получаете доступ к данным вне границ. Я думаю, что это может быть корнем вашей проблемы. Когда вы обращаетесь к openNodes[i][j][6]
, это технически неопределенное поведение, но наиболее вероятным результатом является то, что он читает те же данные, как если бы вы написали openNodes[i][j+1][0]
(когда j < gridsize - 1
). Точно так же openNodes[i][j][7]
эквивалентен доступу к openNodes[i][j+1][1]
с теми же предостережениями.