为什么我的沿路径寻路的算法不起作用?

时间:2013-12-21 15:35:40

标签: c++ segmentation-fault infinite-loop path-finding

我编写了以下两个函数来查找从一个路点到另一个路径的路径但是我得到了一个分段错误,我假设它无休止地循环但是我不明白为什么因为它应该在找到目标路点时停止。 / p>

std::vector<waypoint> Area::getPath(waypoint currentWP, waypoint destWP)
{
    if(currentWP == destWP)
        return returnPath;

    for(unsigned int i=0; i<currentWP.links.size(); i++)
    {
        if(checkDest(*currentWP.links[i], destWP))
        {
            returnPath.push_back(*currentWP.links[i]);
            getPath(*currentWP.links[i], destWP);
        }
    }
    return returnPath;
}

bool Area::checkDest(waypoint currentWP, waypoint destWP)
{
    if(currentWP == destWP)
        return true;

    for(unsigned int i=0; i<currentWP.links.size(); i++)
    {

        if(checkDest(*currentWP.links[i], destWP))
            return true;
    }
    return false;
} 

waypoint是一个结构,包含成员x,y和一个链接数组(类型为* waypoint),它们定义了你可以从航路点走的位置。

getPath应该返回所有路径的数组,您必须沿着这些路径到达目的地路点。 checkDest用于查看特定航点是否位于目的地航点的路径上。

任何人都可以告诉我这个算法是否完全没用,如果是这样,建议更好的方法,或者我只是做了一件小事。

非常感谢你。

#0  0x00007ffff6bd29a5 in _int_malloc () from /usr/lib/libc.so.6
#1  0x00007ffff6bd4c50 in malloc () from /usr/lib/libc.so.6
#2  0x00007ffff747c35d in operator new(unsigned long) () from /usr/lib/libstdc++.so.6
#3  0x000000000040579a in __gnu_cxx::new_allocator<waypoint*>::allocate     (this=0x7fffff7ff1e0, __n=1) at /usr/include/c++/4.8.2/ext/new_allocator.h:104
#4  0x00000000004052cf in std::_Vector_base<waypoint*, std::allocator<waypoint*>     >::_M_allocate (this=0x7fffff7ff1e0, __n=1) at /usr/include/c++/4.8.2/bits/stl_vector.h:168
#5  0x0000000000404b1b in std::_Vector_base<waypoint*, std::allocator<waypoint*> >::_M_create_storage (this=0x7fffff7ff1e0, __n=1) at /usr/include/c++/4.8.2/bits/stl_vector.h:181
#6  0x0000000000403ccf in std::_Vector_base<waypoint*, std::allocator<waypoint*> >::_Vector_base (this=0x7fffff7ff1e0, __n=1, __a=...) at /usr/include/c++/4.8.2/bits/stl_vector.h:136
#7  0x0000000000402c33 in std::vector<waypoint*, std::allocator<waypoint*> >::vector (this=0x7fffff7ff1e0, __x=std::vector of length 1, capacity 1 = {...}) at /usr/include/c++/4.8.2/bits/stl_vector.h:312
#8  0x0000000000402771 in waypoint::waypoint (this=0x7fffff7ff1d0) at Waypoint.h:6
#9  0x0000000000409c3e in Area::checkDest (this=0x6ba3b0, currentWP=..., destWP=...) at Area.cpp:166
#10 0x0000000000409cdd in Area::checkDest (this=0x6ba3b0, currentWP=..., destWP=...) at Area.cpp:172
#11 0x0000000000409cdd in Area::checkDest (this=0x6ba3b0, currentWP=..., destWP=...) at Area.cpp:172

1 个答案:

答案 0 :(得分:0)

看起来你在调用malloc()的构造函数中爆炸了。这可能是由于图表节点中的循环造成的。这将导致无限递归,因此你的内存不足。

使用这种类型的图形导航算法,您需要检查您是否正在重新访问同一节点。最好通过添加访问的节点的哈希表并检查重复来完成 条目。

在您的重复检测周围放置try / catch块,以便在访问已访问的节点之前打印节点并确定图形拓扑。