0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 22
1

Ошибка при использовании new

03.06.2013, 19:08. Показов 1069. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
VS 2010, проект windows forms. Программа компилируется, ошибка при выполнении. Есть класс Graph:

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
#pragma once
struct Vertex {
    int x, y;
    Vertex() : x(0), y(0) {}
};
 
struct Edge {
    int i1, i2;
    Edge() : i1(0), i2(0) {}
};
 
class Graph
{
    int n, m;
    int **A;
    Edge *e;
 
public:
    Graph(int n1);
    Graph(int **A1, int n1);
    Vertex* Output(int x1, int y1, int r);
    int M() {return m;}
    int N() {return n;}
    Edge operator[](int i) {return e[i];}
};
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
Graph::Graph(int **A1, int n1) {
    n = n1;
    A = A1;
    m = 0;
    e = new Edge[n];
    for(int i = 0; i < n; i++) 
        for(int j = i + 1; j < n; j++)
            if(A[i][j]) {
                e[m].i1 = i;
                e[m].i2 = j;
                m++;
            }
}
 
Vertex* Graph::Output(int x1, int y1, int r) {
    int x = x1 + r, y = y1 + r;
    double a = 2 * M_PI / n;
    Vertex *v = new Vertex[n];
    for(int i = 0; i < n; i++) {
        v[i].x = x + r * cos(a * i);
        v[i].y = y + r * sin(a * i);
    }
    return v;
}
Форма пустая, есть только событие OnPaint:
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
        private: System::Void Form1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) {
                 int X = 50, Y = 50, R = 200, N = 6, **A;
                 A = new int*[N];
                 for(int i = 0; i < N; i++) {
                     A[i] = new int[N];
                     for(int j = 0; j < N; j++) A[i][j] = 0;
                 }
                 A[0][1] = 1; A[0][3] = 1; A[0][5] = 1;
                 A[1][0] = 1; A[1][3] = 1; A[1][4] = 1; A[1][5] = 1;
                 A[2][3] = 1; A[2][4] = 1; A[2][5] = 1;
                 A[3][0] = 1; A[3][1] = 1; A[3][2] = 1; A[3][5] = 1;
                 A[4][1] = 1; A[4][2] = 1; A[4][5] = 1;
                 A[5][0] = 1; A[5][1] = 1; A[5][2] = 1; A[5][3] = 1; A[5][4] = 1;
                 Graph G(A, N);
                 Graphics ^g = e->Graphics;
                 Pen ^pen = gcnew Pen(Color::Black);
                 SolidBrush ^brush = gcnew SolidBrush(Color::White);
                 e->Graphics->FillRectangle(brush, X, Y, X + R * 2, Y + R * 2);
                 e->Graphics->DrawRectangle(pen, X, Y, X + R * 2, Y + R * 2);
                 Vertex *V = G.Output(X, Y, R);
                 for(int i = 0; i < N; i++) ;
                 for(int i = 0, m = G.M(); i < m; i++) e->Graphics->DrawLine(pen, V[G[i].i1].x, V[G[i].i1].y, V[G[i].i2].x, V[G[i].i2].y);
                 delete brush;
                 delete pen;
                 delete V;
                 delete A;
             }
При запуске вылетает SEHException was unhandled (Внешний компонент создал исключение) на строчке
C++
1
Vertex *v = new Vertex[n];
из метода Graph::Output
Помогите понять в чём дело, у меня идеи что ещё ткнуть и что вообще может происходить закончились. Если выделаю через calloc, то ошибок нет, но, видимо в результате неуспешной работы calloc, указатель остаётся равным 0.

Добавлено через 18 минут
Наверное стоит добавить, что число n в момент ошибки равно 6, как и полагается.

Добавлено через 31 минуту
строчка 21 из события OnPaint - да, это ничего не делающий цикл. там будет ещё часть отрисовки, в данном вопросе это не важно, т.к. до сюда программа даже не доходит.
C++
1
for(int i = 0; i < N; i++) ;
упреждаю замечание и поднимаю тему.

Добавлено через 43 минуты
upup
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2013, 19:08
Ответы с готовыми решениями:

Ошибка при получении данных из БД при использовании MVC framework 4.0
// HomeControlers.cs using System; using System.Collections.Generic; using System.Linq; using...

Ошибка при сохранении данных в БД при использовании bindingnavigator
Добрый день. Подскажите, куда копать? Есть форма, где в зависимости от выбранного значения combobox...

Ошибка при использовании CDONTS при отправке почты
Помогите, пожалуйста, решить такую проблему. При создании объекта CDONTS.NewMail выдается...

Ошибка при использовании using
Что означает данная ошибка?

6
Модератор
Эксперт С++
13407 / 10517 / 6283
Регистрация: 18.12.2011
Сообщений: 28,074
03.06.2013, 19:31 2
Похоже Вы все же переменной n не присвоили значение.
Проверьте внимательнее
0
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 22
03.06.2013, 19:34  [ТС] 3
Как я уже писал выше - я УБЕДИЛСЯ, что у этой переменной есть значение. Я поставил брекйпоинт и оно равно 6.
0
Модератор
Эксперт С++
13407 / 10517 / 6283
Регистрация: 18.12.2011
Сообщений: 28,074
03.06.2013, 19:36 4
Кстати, V - массив,
поэтому
C++
1
  delete[] V;
1
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 22
03.06.2013, 19:46  [ТС] 5
спасибо, поправил
но проблему это не решило
0
Модератор
Эксперт С++
13407 / 10517 / 6283
Регистрация: 18.12.2011
Сообщений: 28,074
03.06.2013, 19:56 6
проблема в конструкторе
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Graph::Graph(int **A1, int n1) {
    n = n1;
    A = A1;
    m = 0;
    e = new Edge[n];
    for(int i = 0; i < n; i++) 
        for(int j = i + 1; j < n; j++)
            if(A[i][j]) {
                e[m].i1 = i;
                e[m].i2 = j;
                m++;
            }
}
Вы выделяете под e 6 шт.
а m принимает значения большие 5.
Портится память - и, как следствие, не работает new

Удаление массива А тоже поправьте:
C++
1
2
3
for(int i=0;i<N;i++)
     delete[] A[i];
delete[] A;
1
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 22
03.06.2013, 20:08  [ТС] 7
спасибо! действительно не заметил, теперь всё работает
массив А поправил, когда вы сказали про массив V)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2013, 20:08
Помогаю со студенческими работами здесь

Ошибка при использовании массива
Добрый день, друзья! Я тут пишу программу, которая должна сравнивать слова пользователя (которые он...

Ошибка при использовании LockBits
Добрый день, подскажите пожалуйста, в чем моя ошибка. Я создаю Bitmap и пытаюсь с помощью,...

get_Item - ошибка при использовании
Здравствуйте Я использую get_Item метод интерфейса ISecurityCallContext Пример кода: ...

Ошибка при использовании GOTO
что за ошибка?

Ошибка при использовании RS.AddNew
День добрый. Пытаюсь разобраться с ASP classic ( VBScript. Более подходящего раздела на форуме я...

Ошибка при использовании Awesomium
В первый раз использую в своем приложении Awesomium... При старте приложения запускается таймер,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru