2014-01-04 2 views
-1

Я реализую поиск пути A * в C++. Проблема, с которой я столкнулась, связана с указателями и ссылками, которые используются со структурами.C++ ссылки на указатели ссылок на структуры ++

После того, как он выходит из цикла for, он пересекает openList (вектор) и устанавливает currentNode в элемент с наименьшим значением F, F имеет тип int.

Когда сиггепЬЫойя получает изменилась, родитель, который был ранее в течение цикла, присвоенным сиггепЬЫойей, получает изменен

NavigationNode currentNode; 

currentNode.x = 1; 
currentNode.y = 2; 

parent = &currentNode 

если я обновляю сиггепЬЫойе другого значение

currentNode.x =23; 
currentNode.y = 1; 

родитель также будет изменен. Я понимаю, что у родителя есть адрес currentNode. поэтому любые изменения отражаются. Но я хочу знать, как я могу изменить родительское значение. если я потом обновлять сиггепЬЫойе

У меня есть структура объявлен

struct NavigationNode{ 
    int x, y; 
    float f, g, h; 
    int value; 
    NavigationNode *parent; 
}; 

создать startNode из NavigationNode

NavigationNode startNode; 
startNode.x = START_X; 
startNode.y = START_Y; 
startNode.g = 0; 
startNode.f = 0; 

Я вставил его в вектор с именем openList

vector<NavigationNode> openList; 
openList.push_back(startNode); 

NavigationNode currentNode; 

Затем я начинаю поиск пути

while (!openList.empty()) 
{  
    for (auto i = openList.begin(); i != openList.end(); ++i) 
    { 
     if (i == openList.begin() || (*i).f <= currentNode.f) 
     { 
      currentNode = (*i); 
     } 
    } 

    for (int i = 0; i < 8; i++) 
    { 
     NavigationNode nextNode; 
     nextNode.x = xChange; 
     nextNode.y = yChange; 

     // some logic operations 
     // assign the currentNode to the parentNode 

     nextNode.parent = &currentNode; 
     nextNode.value = map[xChange][yChange]; 

     openList.push_back(nextNode); 
    } 
} 
+0

У вас также есть проблема в цикле 'for', чтобы получить' currentNode' не находит узел. Что будет тогда «currentNode»? –

+0

Я добавил вставку элемента в openList – meWantToLearn

+0

Тег 'path' ссылается на пути к файлам, а не на pathfinding. Я скорректировал ваши теги и очистил ваш код, но, пожалуйста, позаботьтесь, чтобы прочитать теги, которые вы используете в будущем. –

ответ

1

Причина, по которой изменения currentNode отражаются в родительском объекте, заключается в том, что я назначаю адрес родительскому. поэтому любые изменения отражаются. Однако теперь я создаю currentNode, как указатель, у него будет другой адрес. и объявили остальное как указатели, а также

NavigationNode *startNode; 
    startNode->x = START_X; 
    startNode->y = START_Y; 
    startNode->g = 0; 
    startNode->f = 0; 


    vector<NavigationNode*> openList; 
    openList.push_back(*startNode); 

    NavigationNode *currentNode = new NavigationNode; 



    while (!openList.empty()) 
    { 

    // sort the vector by increasing F values, so the lowest F values will be at the first location 
    // sort(openList.begin(), openList.end(), compareByF); 
     for (auto i = openList.begin(); i != openList.end(); ++i){ 

      if (i == openList.begin() || (*i)->f <= currentNode->f){ 
       currentNode = (*i); 
      } 
     } 

      for (int i = 0; i < numberOfDirections; i++) 
      { 
       NavigationNode *nextNode = new NavigationNode; 
       nextNode->x = xChange; 
       nextNode->y = yChange; 

       // some logic operations 
       // assign the currentNode to the parentNode 

       nextNode->parent = currentNode; 
       nextNode->value = map[xChange][yChange]; 

       openList.push_back(nextNode); 

      } // end for loop 

     }// end while loop 
Смежные вопросы