Форум программистов, компьютерный форум CyberForum.ru

Почему кидает SEHException? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Не понятная ошибка http://www.cyberforum.ru/cpp-beginners/thread881676.html
Доброго времени суток...))) С++ изучаю второй день, прошу строго не ругать если моя проблема является элементарной, но тем не менее всю ночь просидел в Google и не нашел проблемы. Проблема в коде: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <stdio.h> int main(int argc, char *argv) { char str;
C++ Преобразовать текст, заменяя каждое вхождение слова "это" на слово "то" Преобразовать текст, заменяя каждое вхождение слова "это" на слово "то". Как ни бьюсь, но обработка строк мне почему-то не дается, а сдавать завтра. Помогите, плиз! http://www.cyberforum.ru/cpp-beginners/thread881671.html
C++ Данные из одного стека записать в другой в обратном порядке
доброго времени суток! помогите решить задачу по С++. я создал стек, забил значениям... но как при помощи указателей записать все элементы в другой стек, да еще и в обратном порядке - без понятия... помогите, пожалуйста
Идеально сбалансированное дерево C++
Здравствуйте, помогите пожалуйста с задачкой, очень нужно... Из входного потока (терминала или файла) поступает текст, состоящий из слов, которые разделены пробелами. Между словами может быть более одного пробела. Разобрать текст по словам или по символам (в зависимости от условия), упорядочив его путем сортировки двоичным деревом. Под символами в данном случае подразумеваются лишь те,...
C++ Реализовать классы геометрических абстракций: прямоугольник, квадрат http://www.cyberforum.ru/cpp-beginners/thread881634.html
Реализовать классы геометрических абстракций: прямоугольник, квадрат (разрешается использование других классов, помимо перечисленных). Никакой работы с графической подсистемой выполнять не нужно, вся работа программы заключается в математическом представлении фигуры. Над ними должны быть доступны операции: сериализация в строку (т.е. вывод координат в строковый буфер-строку), десериализация из...
C++ Вектор объектов разных классов. Доступ к свойствам элемента вектора есть базовый класс class A { //... } есть производные классы class A1 : public A { //... public: подробнее

Показать сообщение отдельно
Zarc
0 / 0 / 0
Регистрация: 01.02.2012
Сообщений: 11
28.05.2013, 10:29     Почему кидает SEHException?
Здравствуйте! Ситуация такова: есть клас DCEL (рёберный список с двойной связностью). В нём два public метода: EdgesForVertex - возвращает список указателей на рёбра, смежные c данной вершиной; EdgesForFaces - возвращает список указателей на рёбра, ограничивающие данную грань.

По структуре оба метода одинаковы, но EdgesForVertex работает как положено, а EdgesForFaces кидает тот самый SEHException.

С обработкой исключений на с++ не очень знаком, от того ещё тяжелее разобраться, что к чему.

Использую VS2010.

Привожу код класа DCEL:

DCEL.h

C++
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
//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
C++
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
#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. Для интереса попробовал просто заполнить интовский список, так ошибка стала появляться и в строке
C++
1
list<int> intlist;
Хотя, повторюсь, в схожем методе EdgesForVertex, список рёбер заполнился, как я хотел.

Если надо, выложу другие части кода.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 19:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru