Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2013, 20:57   #1
Zarc
 
Регистрация: 19.02.2012
Сообщений: 5
Вопрос Почему кидает SEHException?

Здравствуйте! Ситуация такова: есть клас 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. Для интереса попробовал просто заполнить интовский список, так ошибка стала появляться и в строке
Код:
list<int> intlist;
Хотя, повторюсь, в схожем методе EdgesForVertex, список рёбер заполнился, как я хотел.

Если надо, выложу другие части кода. Спасибо за внимание!

Последний раз редактировалось Zarc; 27.05.2013 в 21:06.
Zarc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему? С++ xitrec1zaraza Помощь студентам 5 15.03.2011 20:02
Почему 0? Nikita++ Помощь студентам 4 20.10.2010 19:39
Почему? logok Общие вопросы C/C++ 2 12.04.2010 21:59
Почему? Sota О форуме и сайтах клуба 4 26.07.2007 16:26