Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
falcons83
7 / 7 / 4
Регистрация: 30.11.2017
Сообщений: 41
Завершенные тесты: 1
1

Ошибка EAccesViolation в методе класса - C++ Builder/Builder 6

18.04.2018, 04:21. Просмотров 102. Ответов 2
Метки нет (Все метки)

Файл polygon.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
#ifndef __My_Polygon_H
#define __My_Polygon_H
 
#include <ostream>
 
typedef int Coordinate; //тип значения координаты
 
//класс точка, она же вершина многоугольника
class My_Point
{
public:
    int x;
    int y;
 
    //конструкторы дл¤ точки - с ними легче жить
 
    My_Point() {} //конструктор по умолчанию
    My_Point(Coordinate c1, Coordinate c2) //конструктор точки по двум значениям координат
        : x(c1), y(c2)
        {}
};
 
 
//класс многоугольник
class My_Polygon
{
public:
    My_Polygon();   //конструктор по умолчанию, создаЄт пустой мн-к с 0 вершин
    My_Polygon (const My_Polygon&);              //конструктор копировани¤
    My_Polygon (My_Point const* My_Points, int n);    //конструктор из массива точек
    ~My_Polygon();                              //деструктор
 
    My_Point & operator[](int i)        //операци¤ произвольного доступа к вершинам по индексу
          { return My_Points_[i]; }
 
    //вывод в поток лучше делать френдом, а не методом класса 
    friend std::ostream& operator <<(std::ostream & os, My_Polygon const & poly);
    Rotate(int x0, int y0, float angle);//¬ращение
    friend My_Polygon Mirror(My_Polygon z, float a, int b);//ќтражение
    Push(int lx, int ly);//—двиг
    MirrorOfX();//отражение относительно оси X
    operator float(); //приведение типа к float - возвращает периметр
 
private:
    int n_;
    My_Point *My_Points_;
    //Push(int lx, int ly);//—двиг
    float edge_length(int i); //вспомогательна¤ функция - длина i-го ребра 
};
 
#endif __My_Polygon_H
Файл polygon.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
132
133
134
#include "Polygon.h"
#include <math.h>
#include <ostream>
//конструктор по умолчанию, создаЄт пустой мн-к с 0 вершин
My_Polygon::My_Polygon()
{
  n_=0;
  My_Points_= new My_Point[0];
}
 
//конструктор копировани¤
My_Polygon::My_Polygon(My_Polygon const& p)
{
    //передадим всю работу конструктору из массива точек,
    //ведь именно это нам и нужно сделать
    My_Polygon::My_Polygon(p.My_Points_, p.n_);
}
 
 
//конструктор из массива точек
My_Polygon::My_Polygon(My_Point const* My_Points, int n)
{
    n_ = n;
    My_Points_ = new My_Point[n];
    for(int i = 0; i < n; i++)
    {
        My_Points_[i] = My_Points[i];
    } 
} 
 
 
//деструктор
My_Polygon::~My_Polygon() 
{
    if(My_Points_ == 0) 
        return; 
 
    delete[] My_Points_; 
    My_Points_ = 0; 
    n_ = 0; 
}
 
 
//вывод в поток 
std::ostream& operator <<(std::ostream & os, My_Polygon const & poly) 
{ 
    os << "["; 
    for(int i = 0; i < poly.n_; i++) 
    { 
        My_Point const& p = poly.My_Points_[i]; 
        os << "(" << p.x << "  " << p.y << ") ";
    } 
    os << "]";
    return os; 
} 
 
 
//приведение типа к float - возвращает периметр 
My_Polygon::operator float() 
{ 
    float P = 0; //здесь будем накапливать периметр 
    for(int i = 0; i < n_; i++) 
    {
        P += edge_length(i);
    } 
    return P; 
} 
 
//вспомогательная функция - длина i-го ребра 
//т.е. ребра от i-й вершины до следующей 
float My_Polygon::edge_length(int i)
{ 
    if(i < 0) 
    { 
        //рЄбер с номерами меньше 0 нет и быть не может
        //тут можно бы сообщить куда следует об ошибке 
        return 0; 
    } 
 
    if(i >= n_) 
    { 
        //рЄбер с номерами больше номера последней вершины тоже нет 
        //тут можно бы сообщить куда следует об ошибке 
        return 0; 
    } 
 
    int j = i + 1; //следующа¤ вершина
    if(j == n_)    //если i-¤ вершина была последней 
    { 
        j = 0;     //то j-¤ это попросту перва¤ 
    } 
 
    My_Point const& a = My_Points_[i]; 
    My_Point const& b = My_Points_[j]; 
 
    float dx = b.x - a.x;               //проекци¤ ребра на ось X 
    float dy = b.y - a.y;               //проекци¤ ребра на ось Y
    float Length = sqrt(dx*dx + dy*dy); //корень из суммы квадратов - гипотенуза пр¤моугольного треугольника 
 
    return Length; 
}
My_Polygon::Push(int lx, int ly)//Сдвиг
{
    for (int i=0; i<n_; i++)
    {
        My_Points_[i].x+=lx;//на этой строке происходит ошибка
        My_Points_[i].y+=ly;
    }
}
My_Polygon Mirror(My_Polygon z, float a, int b)//«Зеркальное отражение относительно прямой у=ax+b
{
    z.Push(0,-b);
    z.Rotate(0,0,atan(a));
    z.MirrorOfX();
    z.Rotate(0,0,-atan(a));
    z.Push(0,b);
    return z;
}
My_Polygon::Rotate(int x0, int y0, float angle) //Вращение,относительно точки
{
    int TempX;
    for (int i=0; i<n_; i++)
    {
        TempX= My_Points_[i].x;
        My_Points_[i].x=My_Points_[i].x*cos(angle)+My_Points_[i].y*sin(angle);
        My_Points_[i].y=TempX*sin(angle)-My_Points_[i].y*cos(angle);
    }
}
My_Polygon::MirrorOfX()//отражение относительно оси x
{
   for (int i=0; i<n_; i++)
    {
        My_Points_[i].y=-My_Points_[i].y;
    }
тест в консоли Unit1.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define _USE_MATH_DEFINES
using std::cout;
using std::endl;
 
int main()
{
    My_Point My_Points[4] = {My_Point(0, 0), My_Point(0, 100), My_Point(100, 100), My_Point(100, 0)};
    My_Polygon P(My_Points, 4);
    My_Polygon PP;
    cout << "My_Polygon: " << P << endl;
    cout << "perimeter = " << (float)P << endl;
    cout << "first My_Point: (" << P[0].x << " " << P[0].y << ")" << endl;
    P.Push(0,100);
    cout << "My_Polygon: " << P << endl;
    P.Rotate(0,100,M_PI/2);
    cout << "My_Polygon: " << P << endl;
    P=Mirror(P,1,0);//если закомпилировать эту строку то ошибки нет!!!
    system("pause");
    return 0;
}
Ошибка в строке 106 файла polygon.cpp причем если не использую метод Мirror() ee нет. Где искать причину?
0
Миниатюры
Ошибка EAccesViolation в методе класса - C++ Builder/Builder 6  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2018, 04:21
Ответы с готовыми решениями:

Ошибка E2316 (переход с Builder 6, на Builder 2010)
В общем проект создавался на Builder 6, теперь я его пытаюсь скомпилировать на...

Как использовать компоненты скомпилированные для C++ Builder 2007 в C++ Builder 2010?
Народ! Такая проблема... Есть набор компонентов т.н. Dicom VCL. Сайт...

Можно ли использовать C++ Builder v11 если купить Embarcadero C++Builder XE8
День добрый! Есть старый проект С++. Он компилируется на CodeGear™...

Как заставить проект Builder 6 загруженный в Builder 2007 отображать новые кнопки
Люди добрые, кто нибудь встречался с такой проблемой: Я установил Builder...

Какой компилятор C++ Builder использовать? Rad Studio 2009 глючит. C++ Builder 6 старый
Много раз замечал непонятки с компилятором. Масла в огонь подлил Какой...

2
TrollHammer
341 / 233 / 108
Регистрация: 22.02.2018
Сообщений: 713
Записей в блоге: 2
18.04.2018, 04:56 2
Цитата Сообщение от falcons83 Посмотреть сообщение
P=Mirror(P,1,0);//если закомпилировать эту строку то ошибки нет!!!
Передаете (перезаписываете) объект сам на себя.
Вроде должно быть так
C++
1
PP=Mirror(P,1,2);
0
falcons83
7 / 7 / 4
Регистрация: 30.11.2017
Сообщений: 41
Завершенные тесты: 1
18.04.2018, 05:58  [ТС] 3
TrollHammer, Первым делом это проверил, для этoго и создал PP, та же ошибка(.

Добавлено через 9 минут
Почему-то метод Push() отлично работает отдельно но отказывается работать внутри метода Mirror(), тоже относиться и к другим методам. Где-то в Mirror, вот только где?

Добавлено через 44 минуты
Ошибка была в конструкторе копирования
исправил:
C++
1
2
3
4
5
6
7
//Конструктор копирования
My_Polygon::My_Polygon(My_Polygon const& p)
{
    My_Points_ = new My_Point[p.n_];
    My_Points_ = p.My_Points_;
    n_=p.n_;
}
И объявлении метода
исправил:
C++
1
My_Polygon Mirror(const My_Polygon& z, float a, int b)
Тему можно закрывать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2018, 05:58

Как заставить проект сделанный на C++ Builder 6.0 работать на компьютере на котором не установлен этот самый Builder
вопрос абсолютно нубский,но очень волнует...но как заставить проект сделанный...

Перевод проекта с Builder 2010 на Builder 10 Seattle
Добрый день. Перевожу проект написанный на С++ с Builder 2010 на Builder 10...

можно ли в С++ Builder 2006 писать программы на С++ Builder 6?
подскажите, пожалуйста... если программка написана на С++ Builder 2006, могу...


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

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

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