星C + +、何が間違っている

ここでは、なぜそれが動作しないのか分かりません。時にはその大丈夫、時にはそれがクラッシュし、時には間違った方法を返します...

//apath.h

#ifndef APATH_H
#define APATH_H
#include 
#include 
#include 
#include 

using namespace std;

double len(int x1, int y1, int x2, int y2);

class GameMap;

class point
{
public:
      int x,y;
      double f,g;
      point *parent;
      point(int _x=0, int _y=0, point *par=NULL) {x=_x; y=_y; parent=par; f=0; g=0;};
      void countF(int sx, int sy, int tx, int ty)
      {
      g=len(x,y,tx,ty);
      f=g+len(sx,sy,x,y);
      };
};

struct point2d
{
      int x,y;
};

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
const point2d directions[]=
{
      {1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},
};


class path
{
public:
      vector way;
      int step;
      bool findPath(int x, int y, int fx, int fy, GameMap& map, BITMAP* out);
private:
      vector open;
      vector closed;
};


#endif

とapath.cpp:

//apath.cpp

#include "apath.h"
#include 
#include 



double len(int x1, int y1, int x2, int y2) 
{
       return (sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
       //return max(abs(x1-x2), abs(y1-y2));

      /*int mx=max(x1,x2)-min(x1,x2);
      int my=max(y1,y2)-min(y1,y2);
      return (min(mx,my)*14+max(mx,my)-min(mx,my)*10);*/
};

bool findPoint(vector arr, point pt, point &ret)
{
     for (int i=0; i

//ゲームマップはマップを保持しています...

bool path::findPath(int x, int y, int fx, int fy, GameMap& map, BITMAP* out)
{
     while(!open.empty()) open.pop_back();
     while(!closed.empty()) closed.pop_back();
     while(!way.empty()) way.pop_back();

     point start(x,y);
     start.countF(x,y,fx,fy);
     open.push_back(start);

     point finish(fx,fy);

     double min=999999999;
     int index;
     point tmp;
     point *tmp2;
     point comparer;


     while (!findPoint(closed,finish,comparer))
     {
           min=999999999;
           for (int i=0; ix,tmp2->y)==1//map.getCollision returns 1 when you cant pass through the tile and 0 otherwise...
                    || findPoint(closed,*tmp2,comparer)) continue;
                    if (!findPoint(open,*tmp2,comparer)) 
                    { 
                        point newP(tmp.x+directions[i].x,tmp.y+directions[i].y,&closed[closed.size()-1]);
                        newP.countF(x,y,fx,fy);
                        open.push_back(newP);
                    }
                    else
                    {
                        if (comparer.g>tmp.g)
                        {
                             comparer.parent=&closed[closed.size()-1];
                             comparer.countF(x,y,fx,fy);
                        }
                    }
                    delete tmp2;
               }
/*     for (int i=0; i

いくつかの説明: GameMapはマップを持つクラスです そのgetCollisionXYは1を返し、それ以外の場合は0を返します。

任意の助けのための高尚。

2
あなたが間違っていることの1つは、 std :: priority_queue を使用していないということです。
追加された 著者 Fred Foo,
我々はMOOOREが必要です! (クラッシュの詳細、デバッグ出力、バックストロス、何が起こっているべきかの詳細な説明、それは...あなたのコードを勉強するつもりはない)
追加された 著者 Vyktor,
A * c ++、奇妙な行動の可能な複製
追加された 著者 Greg Hewgill,
コードのどの部分がクラッシュを引き起こすかを判断することはできましたか? printlnsを追加するか、デバッガを使用しますか?
追加された 著者 DNA,
私はこの質問で非常に混乱しています。コードはフォーマルではないので、多くのコメントが残されています。私はこれをA-Starの実装として考えましたが、いくつかの問題があります。私はヒューリスティックな機能を見つけられないようですが、どこで最も近い点を選択するのか分かりません。さらに、何らかの形で、ある点の細胞の隣人だけを処理します。あなたはBFSを目指していないと確信していますか?
追加された 著者 Boris Strandjev,
それはパスを再作成しようとするとクラッシュする、私は//クラッシュとしてラインをコメント...
追加された 著者 noisy cat,
発見的関数はlen()であり、それは核種法を使って推定される。私はwhileループの始めにminをcomparerとして使って最小のものを検索します...悪い形式のコードで申し訳ありません、私はちょうど始めます...
追加された 著者 noisy cat,

1 答え

アクセス違反を引き起こす可能性のある主な情報源の1つは、ポイントに親がポインタとして含まれており、それらがベクトルのメンバーであるということです。ベクトルが再割り当てされた場合、これらのポインタは無効になる可能性があります。

それ以外には、クラッシュの原因をすぐに見るのは難しいです。

デバッガを使用してコードを実行する必要があります。私はちょうど私がすぐに見ていることを指摘しました。

1
追加された
素晴らしい、私はそれに取り組むつもりです。あるポイントまでの道のりが以前よりも近いときに親が変わった部分を見てください。また、もしそれが最良のheuretic関数をeuclides知っていない...
追加された 著者 noisy cat,