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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
roma2341
7 / 7 / 2
Регистрация: 01.11.2012
Сообщений: 55
#1

Необработаное исключение - C++

27.03.2013, 01:21. Просмотров 1364. Ответов 7
Метки нет (Все метки)

создаю программу, которая будет находить на отрезке 10 точек, находящихся на одинаковом расстоянии одна от другой(но это неважно), с математической частью все впорядке а вот в одном из класов есть проблема, немогу понять где я эту проблему спрятал. Пишет ошибку
Кликните здесь для просмотра всего текста
ервый этап обработки исключения по адресу 0x00872DE9 в mfcCursova.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000004.
Необработанное исключение по адресу 0x00872DE9 в mfcCursova.exe: 0xC000041D: Во время обратного вызова пользователя обнаружено необработанное исключение.
Программа "[5644] mfcCursova.exe" завершилась с кодом 0 (0x0).

вот мой код :
mfcCursovaDlg.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
void CmfcCursovaDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // контекст устройства для рисования
 
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 
        // Выравнивание значка по центру клиентского прямоугольника
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
 
        // Нарисуйте значок
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        FILE* frMain,*frPoints;
fopen_s(&frMain,"inpMain.txt","r");
fopen_s(&frPoints,"inpPoints.txt","r");
Segment MainCordinate;
    int i=0; 
    //Point points[10];
    int midDelta = 0;int a,b,c,d;
    fscanf_s(frMain,"%d*%d%d*%d",&a,&b,&c,&d);
    MainCordinate.SetX(a),MainCordinate.SetY(b),MainCordinate.SetX2(c),MainCordinate.SetY2(d);
fclose(frMain);
 
MainCordinate.SetLength(sqrt(pow((float)MainCordinate.GetX2()-MainCordinate.GetX(),2)+pow((float)MainCordinate.GetY2()-MainCordinate.GetY(),2)));
MainCordinate.SetPart((float)MainCordinate.GetLength()/9);
Lamana broken1;
while(!feof(frPoints)) 
{
    int x,y,dtY;
    fscanf_s(frPoints,"%d",&dtY);
    x=MainCordinate.GetX() + MainCordinate.GetPart()*i * (MainCordinate.GetX2()-MainCordinate.GetX()) / MainCordinate.GetLength();
        y=MainCordinate.GetY() + MainCordinate.GetPart()*i * (MainCordinate.GetY2()-MainCordinate.GetY()) / MainCordinate.GetLength()+dtY;
        broken1.AddPoint(x,y);
}
        CDialogEx::OnPaint();
    
fclose(frPoints);
    }
}

class.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
#pragma once
class Point{
    private:
        int x,y,color;
public:
    void SetX(int x);
    void SetY(int y);
    void SetColor(int color);
    int GetX(void);
    int GetY(void);
    int GetColor(void); 
    };
class Segment:public Point{
    private:
    int x2;
    int y2;
    float length;float part;
    public:
    void SetX2(int x2);
    void SetY2(int y2);
    void SetLength(float length);
    void SetPart(float part);
    int GetX2(void);
    int GetY2(void);
    float GetLength(void);
    float GetPart(void);
    };
class Lamana{
private:
    Point *Arr;
public:
    Lamana();
    int pos;
void AddPoint(int x,int y);
};

description.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
#include "StdAfx.h"
#include "class.h"
void Point::SetX(int x)
{
    this->x=x;
}
void Point::SetY(int y)
{
    this->y=y;
}
void Point::SetColor(int color)
{
    this->color=color;
}
 
//опис класу точка
    int Point::GetX(void)
    {
        return x;
    }
    int Point::GetY(void)
    {
        return y;
    }
    int Point::GetColor(void)
    {
        return color;
    }
 
    
    //опис класу відрізок
int Segment::GetX2(void)
    {
        return x2;
    }
    int Segment::GetY2(void)
    {
        return y2;
    }
    float Segment::GetPart(void)
    {
        return part;
    }
    float Segment::GetLength(void)
    {
        return length;
    }
 void Segment::SetX2(int x2)
 {
     this->x2=x2;
 }
    void Segment::SetY2(int y2)
    {
        this->y2=y2;
    }
    void Segment::SetLength(float length)
    {
        this->length=length;
    }
    void Segment::SetPart(float part)
    {
        this->part=part;
    }
    
 
void Lamana::AddPoint(int x,int y)
{
Arr[pos].SetX(x);
Arr[pos++].SetY(y);
}
Lamana::Lamana()
{
    pos=0;
}

Прошу прощение , если код плохо читаемый, код точно правельный до того момента, когда вызывается метод AddPoint(x,y); Все что создавалось автоматически визуал студио я не стал вылаживать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
1701 / 1194 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
27.03.2013, 07:00     Необработаное исключение #2
roma2341, простите, а кто для поля Arr класса Lamana память будет выделять? Вы просто объявили указатель на объект (или вектор объектов), а где сам объект/объекты.
roma2341
7 / 7 / 2
Регистрация: 01.11.2012
Сообщений: 55
27.03.2013, 18:09  [ТС]     Необработаное исключение #3
anmartex, большое спасибо, программа запустилась, но по какой-то причине она записывает в массив копии одной точки, хотя координаты x, y вычисляются правильно, правильно ли я описал метод класса Lamana AddPoint?
anmartex
...
1701 / 1194 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
27.03.2013, 18:57     Необработаное исключение #4
roma2341, честно, я бы на вашем месте использовал какой-нибудь последовательный STL-овский контейнер вместо построения огорода в лице класса Lamana. Хотя я вообще не понимаю его физический смысл, ибо доступа к элементам массива (судя по интерфейсу) у пользователя всё равно нет, единственное что доступно - это нарушающее инкапсуляцию поле pos. Хотя может в новой версии что-то поменялось? Выложите нынешнее описание и реализацию данного класса.
roma2341
7 / 7 / 2
Регистрация: 01.11.2012
Сообщений: 55
27.03.2013, 19:42  [ТС]     Необработаное исключение #5
обьявление
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
class Lamana{
private:
public:
    Point *Arr;
    Lamana();
    int pos;
void AddPoint(int x,int y);
};

описание
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
void Lamana::AddPoint(int x,int y)
{
Arr[pos].SetX(x);
Arr[pos].SetY(y);
pos+=1;
}
Lamana::Lamana()
{
    Arr=new Point[10];
    pos=0;
}

Я считал , что можно получить доступ к точке массива, через метод класса - точка, или я неправильно рассуждаю? Я 1 курс, поетому что такое контейнеры незнаю, ООП недавно начал учить.
anmartex
...
1701 / 1194 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
27.03.2013, 20:07     Необработаное исключение #6
Цитата Сообщение от roma2341 Посмотреть сообщение
Я считал , что можно получить доступ к точке массива, через метод класса - точка, или я неправильно рассуждаю?
Честно говоря, не совсем понял.

Замечания к реализации класса Lamana:
  1. Открытые поля класса - дурной тон. Я имею в виду Arr и pos
  2. В конструкторе выделяете память, а освобождать кто будет?
  3. Метод AddPoint не контролирует выход за границы массива.

Но при всём при этом, класс должен сохранять ваши значения. А при добавлении x и y у вас они точно различны?
roma2341
7 / 7 / 2
Регистрация: 01.11.2012
Сообщений: 55
27.03.2013, 21:22  [ТС]     Необработаное исключение #7
вся соль в том что каждая итерация цикла генерирует разные значения, но в Arr помещаются сгенерированые на первой итерации а потом при новых значениях икса и игрика, в Arr помещаються старые. В форму значения не выводил, я прослеживаю значения в визуал студио, используя брекпоин, а потом пошагово просматривая изменение информации в переменных.

Добавлено через 12 минут
Я невнемательно перенес свой консольный проек, i на pos надо было поменять, но и это не помогло.

Добавлено через 21 минуту
помоему я ошибался, программа рисует по тем точкам, которые мне как-раз нужны, как преобразовать результат из Arr к такому виду, чтобы можно было использовать функцию dc.Polyline(pt,n)?

Добавлено через 18 минут
ах да, при попытке использования пишет
CDC::Polyline: невозможно преобразовать параметр 1 из "Point *" в "const POINT *"
Программа работает как надо, когда я использую
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dc.MoveTo(MainCordinate.GetX(),MainCordinate.GetY());
dc.LineTo(MainCordinate.GetX2(),MainCordinate.GetY2());
dc.SelectObject(bluePen);
dc.MoveTo(MainCordinate.GetX(),MainCordinate.GetY());
dc.LineTo(broken1.Arr[0].GetX(),broken1.Arr[0].GetY());
dc.LineTo(broken1.Arr[1].GetX(),broken1.Arr[1].GetY());
dc.LineTo(broken1.Arr[2].GetX(),broken1.Arr[2].GetY());
dc.LineTo(broken1.Arr[3].GetX(),broken1.Arr[3].GetY());
dc.LineTo(broken1.Arr[4].GetX(),broken1.Arr[4].GetY());
dc.LineTo(broken1.Arr[5].GetX(),broken1.Arr[5].GetY());
dc.LineTo(broken1.Arr[6].GetX(),broken1.Arr[6].GetY());
dc.LineTo(broken1.Arr[7].GetX(),broken1.Arr[7].GetY());
dc.LineTo(broken1.Arr[8].GetX(),broken1.Arr[8].GetY());
dc.LineTo(broken1.Arr[9].GetX(),broken1.Arr[9].GetY());
dc.Polyline(broken1.Arr,10)

Но эта запись будет не по душе преподавателю, пожалуйста, подскажите какие еще у меня косяки, я почитаю и исправлю их.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2013, 04:34     Необработаное исключение
Еще ссылки по теме:

исключение C++
Исключение C++
Необработанное исключение C++
Чтение/запись бинарного файла: необработаное исключение C++
C++ Необработанное исключение

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

Или воспользуйтесь поиском по форуму:
anmartex
...
1701 / 1194 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
28.03.2013, 04:34     Необработаное исключение #8
Цитата Сообщение от roma2341 Посмотреть сообщение
как преобразовать результат из Arr к такому виду, чтобы можно было использовать функцию dc.Polyline(pt,n)?
Polyline работает с POD структурой POINT. Соответственно если вы попытаетесь скормить данной функции свой класс Point, естественно у вас вылезет ошибка вида:
Цитата Сообщение от roma2341 Посмотреть сообщение
CDC::Polyline: невозможно преобразовать параметр 1 из "Point *" в "const POINT *"
Цитата Сообщение от roma2341 Посмотреть сообщение
Но эта запись будет не по душе преподавателю
И мне бы не понравилось. Тогда уж так:
C++
1
2
3
4
5
6
7
   dc.MoveTo(MainCordinate.GetX(),MainCordinate.GetY());
   dc.LineTo(MainCordinate.GetX2(),MainCordinate.GetY2());
   dc.SelectObject(bluePen);
   dc.MoveTo(MainCordinate.GetX(),MainCordinate.GetY());
 
   for (size_t i = 0; i < 10; ++i)
      dc.LineTo(broken1.Arr[i].GetX(),broken1.Arr[i].GetY());
Но если вы всё же хотите использовать dc.Polyline(pt,n), то вам необходимо выполнить преобразование
C++
1
2
3
4
5
6
7
8
9
   POINT pt[10];
 
   for (size_t i = 0; i < 10; ++i)
   {
      pt[i].x = broken1.Arr[i].GetX();
      pt[i].y = broken1.Arr[i].GetY();
   }
 
   dc.Polyline(pt,10)
Yandex
Объявления
28.03.2013, 04:34     Необработаное исключение
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru