Здравствуйте! Ситуация такова: есть клас DCEL (рёберный список с двойной связностью). В нём два public метода: EdgesForVertex - возвращает список указателей на рёбра, смежные c данной вершиной; EdgesForFaces - возвращает список указателей на рёбра, ограничивающие данную грань.
По структуре оба метода одинаковы, но EdgesForVertex работает как положено, а EdgesForFaces кидает тот самый SEHException.
С обработкой исключений на с++ не очень знаком, от того ещё тяжелее разобраться, что к чему.
Использую VS2010.
Привожу код класа DCEL:
DCEL.h
Код:
//Double connected edge list
#pragma once
#ifndef DCEL_H
#define DCEL_H
#include <vector>
#include <list>
using namespace std;
namespace EDM
{
namespace Model
{
namespace TriangulationMethod
{
class TriangActor;
}
}
namespace EDM_Graphics
{
class Point2F;
}
}
using namespace EDM::EDM_Graphics;
using namespace EDM::Model::TriangulationMethod;
namespace EDM {namespace Logic { namespace Voronoi
{
class EdgeNode;
typedef vector<EdgeNode> DCEL_EdgesT;
class DCEL
{
public:
DCEL_EdgesT edges;
DCEL(size_t size);
~DCEL();
// Returns the list of pointers to adj edges enumerated in counterclockwise direction for vertex.
list<EdgeNode*> EdgesForVertex(const Point2F &vertex);
// Returns the list of pointers to adj edges enumerated in clockwise direction for face.
list<EdgeNode*> EdgesForFaces(const TriangActor &face);
private:
EdgeNode* FirstCCWEdgeForVertex(const Point2F &vertex);
EdgeNode* NextCCWEdgeForVertex(const Point2F &vertex, EdgeNode *nextEdge);
EdgeNode* FirstCWEdgeForFace(const TriangActor &face);
EdgeNode* NextCWEdgeForFace(const TriangActor &face, EdgeNode *nextEdge);
};
}}}
#endif
DCEL.cpp
Код:
#include "Point2F.h"
#include "TriangActor.h"
#include "EdgeNode.h"
#include "DCEL.h"
using namespace EDM::EDM_Graphics;
using namespace EDM::Model::TriangulationMethod;
using namespace EDM::Logic::Voronoi;
DCEL::DCEL(size_t size)
{
edges.reserve(size);
}
DCEL::~DCEL()
{
/*for (DCEL_EdgesT::iterator edgeIter = edges.begin(); edgeIter != edges.end(); edgeIter++)
{
delete *edgeIter;
}*/
edges.clear();
}
list<EdgeNode*> DCEL::EdgesForVertex(const Point2F &vertex)
{
EdgeNode *nextEdge = FirstCCWEdgeForVertex(vertex);
if (!nextEdge)
{
//TODO: throw correct exception
throw -1;
}
EdgeNode *startEdge = nextEdge;
list<EdgeNode*> adjEdges = list<EdgeNode*>();
adjEdges.push_back(nextEdge);
nextEdge = NextCCWEdgeForVertex(vertex, nextEdge);
while(*nextEdge != *startEdge)
{
adjEdges.push_back(nextEdge);
nextEdge = NextCCWEdgeForVertex(vertex, nextEdge);
}
return adjEdges;
}
EdgeNode* DCEL::FirstCCWEdgeForVertex(const Point2F &vertex)
{
for (size_t edgeCntr = 0; edgeCntr < edges.size() ; edgeCntr++)
{
if ((*(edges[edgeCntr].vBegin) == vertex) || (*(edges[edgeCntr].vEnd) == vertex))
{
return &(edges[edgeCntr]);
}
}
return nullptr;
}
EdgeNode* DCEL::NextCCWEdgeForVertex(const Point2F &vertex, EdgeNode *nextEdge)
{
if (*(nextEdge->vBegin) == vertex)
{
return nextEdge->p1;
}
else
{
return nextEdge->p2;
}
}
list<EdgeNode *> DCEL::EdgesForFaces(const TriangActor &face)
{
EdgeNode *nextEdge = FirstCWEdgeForFace(face);
if (!nextEdge)
{
//TODO: throw correct exception
throw -1;
}
EdgeNode *startEdge = nextEdge;
//////////////////////////////////////////////////////////////////////////
//SEHExeption при создании списка
list<int> intlist;
intlist.push_back(1);
intlist.push_back(2);
intlist.push_back(3);
intlist.push_back(4);
//////////////////////////////////////////////////////////////////////////
//та же ошибка
list<EdgeNode *> adjEdges;
adjEdges.push_back(nextEdge);
nextEdge = NextCWEdgeForFace(face, nextEdge);
while(*nextEdge != *startEdge)
{
adjEdges.push_back(nextEdge);
nextEdge = NextCWEdgeForFace(face, nextEdge);
}
return adjEdges;
}
EdgeNode* DCEL::FirstCWEdgeForFace(const TriangActor &face)
{
for (size_t edgeCntr = 0; edgeCntr < edges.size() ; edgeCntr++)
{
if ((*(edges[edgeCntr].fLeft) == face) || (*(edges[edgeCntr].fRight) == face))
{
return &(edges[edgeCntr]);
}
}
return nullptr;
}
EdgeNode* DCEL::NextCWEdgeForFace(const TriangActor &face, EdgeNode *nextEdge)
{
if (*(nextEdge->fLeft) == face)
{
return nextEdge->p1;
}
else
{
return nextEdge->p2;
}
}
Ошибка вылетает в методе EdgesForFaces, когда пытаюсь создать список adjEdges. Для интереса попробовал просто заполнить интовский список, так ошибка стала появляться и в строке
Хотя, повторюсь, в схожем методе EdgesForVertex, список рёбер заполнился, как я хотел.
Если надо, выложу другие части кода. Спасибо за внимание!