1Danke
ERLEDIGT
JA
JA
ANTWORTEN
2
2
ZUGRIFFE
299
299
EMPFEHLEN
-
Guten tag,
ich habe im Momment ein Problem mit einem Falschpointer.
Ich habe eine Liste mit fester Größe, die eine 2DMap representieren soll.
Mit den X und Y coordinaten errechne ich den Offset um das richtige Node
aus der liste zu bekommen. Dabei bekomme ich leider einen Falschpointer
zurückgeliefert.
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
#include <iostream> #define OFFSET_OF(X, Y, DIMENSION_X) (Y * DIMENSION_X + X) #define ABS(N) (N < 0 ? -N : N) #define CALC_H(CUR_NODE, END_NODE) ((ABS(CUR_NODE->GetX() - END_NODE->GetX()) * 10) + (ABS(CUR_NODE->GetY() - END_NODE->GetY()) * 10)) enum PathNodeState { UNTOUCHED, OPEN, CLOSED }; class PathNode { public: PathNode() : m_X(0), m_Y(0), m_Parent(NULL), m_IsWalkable(true), m_State(UNTOUCHED), m_F(0), m_G(0), m_H(0) {} void SetCoords(int X, int Y) { m_X = X; m_Y = Y; } void SetParent(PathNode *Parent) { m_Parent = Parent; } void SetIsWalkable(bool IsWalkable) { m_IsWalkable = IsWalkable; } void SetState(PathNodeState State) { m_State = State; } void SetPathScore(int G, int H) { m_G = G; m_H = H; m_F = m_G + m_H; } int GetX() { return m_X; } int GetY() { return m_Y; } PathNode *GetParent() { return m_Parent; } bool IsWalkable() { return m_IsWalkable; } PathNodeState GetState() { return m_State; } int GetF() { return m_F; } int GetG() { return m_G; } int GetH() { return m_H; } bool operator==(PathNode *Node) { return Node->GetX() == m_X && Node->GetY() == m_Y; } private: int m_X; int m_Y; PathNode *m_Parent; bool m_IsWalkable; PathNodeState m_State; int m_F; int m_G; int m_H; }; class AStarPath { public: /* AStartPath(PathNode **Map, int AreaDimensionX, int AreaDimensionY) : m_Map(Map), m_AreaDimensionX(AreaDimensionX), m_AreaDimensionY(AreaDimensionY) { }*/ AStarPath() { CreateExampleMap(); } PathNodeList *FindPath(int StartX, int StartY, int EndX, int EndY) { PathNode *StartNode = m_Map[OFFSET_OF(StartX, StartY, m_AreaDimensionX)]; PathNode *EndNode = m_Map[OFFSET_OF(EndX, EndY, m_AreaDimensionX)]; PathNode *CurrentNode = StartNode; PathNodeList *NodeList = new PathNodeList(m_AreaDimensionX, m_AreaDimensionY); while (true) { if (CurrentNode == EndNode) { NodeList->Add(CurrentNode); std::cout << "Path found :)" << std::endl; std::cout << "m_OpenList with " << m_OpenList->GetSize() << " elements left." << std::endl; std::cout << "m_ClosedList with " << m_ClosedList->GetSize() << " elements." << std::endl; /* * Trace Path: * Start from EndNode. * Stop when we reach StartNode. * NodeList will contain the path including start and end node. */ PathNode *LastNode = EndNode; while (LastNode != StartNode) { PathNode *ParentNode = LastNode->GetParent(); NodeList->Add(ParentNode); LastNode = ParentNode; } return NodeList; } PathNode *CheckNode = NULL; if (CurrentNode->GetX() > 0 && CurrentNode->GetY() > 0) { CheckNode = m_Map[OFFSET_OF(CurrentNode->GetX() - 1, CurrentNode->GetY() - 1, m_AreaDimensionX)]; if (CheckNode->IsWalkable() && m_Map[OFFSET_OF(CurrentNode->GetX() - 1, CurrentNode->GetY(), m_AreaDimensionX)]->IsWalkable() && m_Map[OFFSET_OF(CurrentNode->GetX(), CurrentNode->GetY() - 1, m_AreaDimensionX)]->IsWalkable()) { ......................... private: int m_AreaDimensionX; int m_AreaDimensionY; PathNode **m_Map; PathNodeList *m_OpenList; /* * Do we really need the list for closed nodes? * Maybe remove it, we have PathNodeState(UNTOUCHED or OPEN or CLOSED) in each PathNode * and we don't use the closed list expect for adding closed PathNodes */ PathNodeList *m_ClosedList; /* * Initializes members for testing */ void CreateExampleMap() { m_AreaDimensionX = 7; m_AreaDimensionY = 5; m_Map = new PathNode*[m_AreaDimensionX * m_AreaDimensionY]; m_OpenList = new PathNodeList(m_AreaDimensionX, m_AreaDimensionY); m_ClosedList = new PathNodeList(m_AreaDimensionX, m_AreaDimensionY); for (unsigned int x=0;x<m_AreaDimensionX;++x) { for (unsigned int y=0;y<m_AreaDimensionY;++y) { int Offset = OFFSET_OF(x, y, m_AreaDimensionX); m_Map[Offset] = new PathNode; m_Map[Offset]->SetCoords(x, y); } } m_Map[OFFSET_OF(4, 1, m_AreaDimensionX)]->SetIsWalkable(false); m_Map[OFFSET_OF(4, 2, m_AreaDimensionX)]->SetIsWalkable(false); m_Map[OFFSET_OF(4, 3, m_AreaDimensionX)]->SetIsWalkable(false); } }; int main(int argc, char *argv[]) { AStarPath Pathfind; Pathfind.FindPath(2, 2, 6, 2); }
Es geht um
CheckNode = m_Map[OFFSET_OF(CurrentNode->GetX() - 1, CurrentNode->GetY() - 1, m_AreaDimensionX)];
Dies scheint mir einen falschen Pointer zurückzuliefern, StartNode und EndNode sind
laut Debugger in ordnung und deren member haben auch die erwarteten Werte.
Der Debugger sagt mir access violation in der Methode PathNode::IsWalkable()
von CheckNode.
Best wisches
FBIagentDon't blame people for bugs. Work together to make things better. No
finger pointing! Not ever! A good rule is to Never Assume An Attack.
If you find yourself getting angry, assume it's a misunderstanding, not an
attack.
-
28.10.07 19:37 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Makros sind toll - man sollte sie allerdings äußerst sparsam und mit Bedacht einsetzen.
Z.B. dein ABS Makro ist problematisch weil dort der Parameter mehrfach ausgewertet wird. Warum nimmst du nicht einfach abs() aus cmath?
Dein OFFSET_OF Makroaufruf fürwird expandiert zu:Code cpp:1
CheckNode = m_Map[OFFSET_OF(CurrentNode->GetX() - 1, CurrentNode->GetY() - 1, m_AreaDimensionX)];
Ich denke mal du siehst was falsch ist (Tipp: Punktrechnung geht vor Strichrechnung)Code cpp:1
CheckNode = m_Map[(CurrentNode->GetY() - 1 * m_AreaDimensionX + CurrentNode->GetX() - 1)];
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ja das hats gebracht, danke.
Mal wieder was dazu gelernt
Don't blame people for bugs. Work together to make things better. No
finger pointing! Not ever! A good rule is to Never Assume An Attack.
If you find yourself getting angry, assume it's a misunderstanding, not an
attack.
Ähnliche Themen
-
DvD-Player liest manche Avi-Files nicht!
Von stEEdZ im Forum Videoschnitt, Videotechnik & -produktionAntworten: 3Letzter Beitrag: 19.10.08, 20:43 -
Manche Grafiken werden nicht angezeigt.
Von Danielku15 im Forum Microsoft WindowsAntworten: 0Letzter Beitrag: 26.04.07, 23:26 -
warum funktionieren manche filter nicht?
Von reichs im Forum PhotoshopAntworten: 2Letzter Beitrag: 12.10.06, 10:10 -
Kann manche PHP Seiten nicht anzeigen!
Von CikoNo1 im Forum Linux & UnixAntworten: 7Letzter Beitrag: 19.10.05, 09:39 -
Wieso manche Objekte nicht instanzieren?
Von chell im Forum JavaAntworten: 4Letzter Beitrag: 21.03.05, 16:51





Zitieren
Login






