分段故障

时间:2019-01-21 10:35:48

标签: c++ c artificial-intelligence

因此,我目前正在为这个学校项目工作,正在实施一种算法来找到“骑士游戏”的解决方案(这是找到从棋盘左上角到右下角的最短路径)的方法),但现在已经出现了三段错误,我检查了我使用的每个指针,一切似乎都正确。 我建议使用“搜索算法”(bfs,dfs和ucs),前两个算法可以正常工作,但是ucs会给我带来分割错误,尽管它们使用的是popBest函数,但它们使用的是相同的东西。 这是ucs和popBest函数的一些图片:

Item *popBest( list_t *list ) // and remove the best board from the list.
{
  assert(list);
  assert(list->numElements);


  int min_f;

  Item *item = list->first;
  Item *best;
  min_f = list->first->f;

  while (item) {
    if (item->f < min_f) {
      min_f = item->f;
      best = item;
    }
    item = item->next;
  }
  //item = onList(list, board);
  delList(list, best);

  return best;
}

void ucs(void)

{
    Item *cur_node, *child_p, *temp;


    while ( listCount(&openList_p) ) { /* While items are on the open list 
        printLt(openList_p );
        /* Get the first item on the open list*/
        cur_node = popBest(&openList_p);
        //printf("%d  %f\n", listCount(&openList_p), evaluateBoard( cur_node ));
        printBoard(cur_node);


        addFirst(&closedList_p, cur_node);

        if ( evaluateBoard(cur_node) == 0.0 ) {
            showSolution(cur_node);
            printf("\nParcours en largeur (bfs)\n" );
            return;
       }
       else {


            for (int i = 0; i < MAX_BOARD; i++) {
                child_p = getChildBoard( cur_node, i );

                if (child_p != NULL) {
                    child_p->f = cur_node->f+1;
                    temp = onList(&openList_p, child_p->board);
                    if (temp ==NULL) addLast( &openList_p, temp);
                    else if (temp != NULL && child_p->f < temp->f )
                    {
                        delList(&openList_p, temp);
                        addLast( &openList_p, temp);
                    }
                  }
                }
            }
        }

    return;
}

所有功能对于bfs和dfs都可以正常工作,唯一的区别是popBest函数。 如果我仍然是初学者,如果有人可以指导我,那将非常棒,谢谢。

PS:对不起,英语不好,我不是本地人。

1 个答案:

答案 0 :(得分:1)

您执行list->first->f时没有检查list->first是否为空指针。

问题的原因可能是best可能在循环后未初始化,并且肯定是列表中的第一个元素是“最佳”。

这是一个更安全的版本。

Item *popBest( list_t *list )
{
  assert(list);
  assert(list->numElements);
  assert(list->first);

  // Assume that the first element is best.
  Item *best = list->first;
  int min_f = best->f;

  // Search from the second element (if it exists).
  Item* item = best->next;
  while (item) {
    if (item->f < min_f) {
      min_f = item->f;
      best = item;
    }
    item = item->next;
  }
  delList(list, best);
  return best;
}