С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 2
Регистрация: 06.02.2015
Сообщений: 67

Проблема с динамической памятью

17.12.2018, 23:55. Показов 1153. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При повторном нажатии Button1 появляется ошибка pow: OVERFLOW error или Invalid floating point operation

Unit1.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
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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <math.h>
#include <Chart.hpp>
#include <ExtCtrls.hpp>
#include <Series.hpp>
#include <TeEngine.hpp>
#include <TeeProcs.hpp>
#include <Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label3;
        TComboBox *ComboBox1;
        TEdit *Edit1;
        TEdit *EditX1;
        TButton *Button1;
        TLabel *Label4;
        TEdit *Edit3;
        TLabel *Label5;
        TEdit *EditY1;
        TLabel *Label6;
        TEdit *EditM1;
        TLabel *Label7;
        TEdit *EditVX1;
        TLabel *Label8;
        TEdit *EditVY1;
        TLabel *Label9;
        TLabel *Label15;
        TLabel *Label16;
        TEdit *EditX2;
        TLabel *Label10;
        TEdit *EditY2;
        TLabel *Label11;
        TEdit *EditM2;
        TLabel *Label12;
        TEdit *EditVX2;
        TLabel *Label13;
        TEdit *EditVY2;
        TLabel *Label14;
        TChart *Chart1;
        TPointSeries *Series1;
        TPointSeries *Series2;
        TEdit *Edit2;
        TLabel *Label17;
        TEdit *Edit4;
        TEdit *EditX3;
        TLabel *Label18;
        TEdit *EditY3;
        TLabel *Label19;
        TEdit *EditM3;
        TLabel *Label20;
        TEdit *EditVX3;
        TLabel *Label21;
        TEdit *EditVY3;
        TLabel *Label22;
        TLabel *Label23;
        TLabel *Label24;
        TEdit *EditX4;
        TLabel *Label25;
        TEdit *EditY4;
        TLabel *Label26;
        TEdit *EditM4;
        TLabel *Label27;
        TEdit *EditVX4;
        TLabel *Label28;
        TEdit *EditVY4;
        TLabel *Label29;
        TPointSeries *Series3;
        TPointSeries *Series4;
        TStringGrid *StringGrid1;
        TLabel *Label30;
        TLabel *Label31;
        TLabel *Label32;
        TLabel *Label33;
        TLabel *Label34;
        TLabel *Label35;
        TLabel *Label36;
        TLabel *Label37;
        TLabel *Label38;
        TButton *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
        void calculateForces();
        void moveBodies();        
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
struct point{
    double x,y;
};
int n;
point *p, *v, *f;
double *m;
double G; //= 0.1; //6.67e-11;
double h, T;
 
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        ComboBox1->Items->Add(2);
        ComboBox1->Items->Add(3);
        ComboBox1->Items->Add(4);
        ComboBox1->ItemIndex = 0;
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        double counter = 0;
        int i = 0;
 
        h = StrToFloat(Edit1->Text);
        n = StrToInt(ComboBox1->Text);
        T = StrToFloat(Edit3->Text);
        G = StrToFloat(Edit4->Text);
        p = new point[n];
        v = new point[n];
        f = new point[n];
        m = new double[n];
 
 
 
 
        Series1->Clear();
        Series2->Clear();
        Series3->Clear();
        Series4->Clear();
        Chart1->Refresh();
        StringGrid1->RowCount = 1;
 
        if(n == 2){
                p[0].x = StrToFloat(EditX1->Text); p[0].y = StrToFloat(EditY1->Text);
                m[0] = StrToFloat(EditM1->Text);
                v[0].x = StrToFloat(EditVX1->Text); v[0].y = StrToFloat(EditVY1->Text);
 
                p[1].x = StrToFloat(EditX2->Text); p[1].y = StrToFloat(EditY2->Text);
                m[1] = StrToFloat(EditM2->Text);
                v[1].x = StrToFloat(EditVX2->Text); v[1].y = StrToFloat(EditVY2->Text);
 
                while (counter < T){
                        StringGrid1->Cells[0][i] = FloatToStrF(counter, ffGeneral, 4, 4) ;
                        StringGrid1->Cells[1][i] = FloatToStr(p[0].x);
                        StringGrid1->Cells[2][i] = FloatToStr(p[0].y);
                        StringGrid1->Cells[3][i] = FloatToStr(p[1].x);
                        StringGrid1->Cells[4][i] = FloatToStr(p[1].y);
                        StringGrid1->RowCount += 1;
 
                        Series1->AddXY(p[0].x, p[0].y);
                        Series2->AddXY(p[1].x, p[1].y);
                        calculateForces();
                        moveBodies();
 
                        counter += h;
                        i += 1;
                }
        }
 
        if(n == 3){
                p[0].x = StrToFloat(EditX1->Text); p[0].y = StrToFloat(EditY1->Text);
                m[0] = StrToFloat(EditM1->Text);
                v[0].x = StrToFloat(EditVX1->Text); v[0].y = StrToFloat(EditVY1->Text);
 
                p[1].x = StrToFloat(EditX2->Text); p[1].y = StrToFloat(EditY2->Text);
                m[1] = StrToFloat(EditM2->Text);
                v[1].x = StrToFloat(EditVX2->Text); v[1].y = StrToFloat(EditVY2->Text);
 
                p[2].x = StrToFloat(EditX3->Text); p[2].y = StrToFloat(EditY3->Text);
                m[2] = StrToFloat(EditM3->Text);
                v[2].x = StrToFloat(EditVX3->Text); v[2].y = StrToFloat(EditVY3->Text);
 
                while (counter < T){
                        StringGrid1->Cells[0][i] = FloatToStrF(counter, ffGeneral, 4, 4) ;
                        StringGrid1->Cells[1][i] = FloatToStr(p[0].x);
                        StringGrid1->Cells[2][i] = FloatToStr(p[0].y);
                        StringGrid1->Cells[3][i] = FloatToStr(p[1].x);
                        StringGrid1->Cells[4][i] = FloatToStr(p[1].y);
                        StringGrid1->Cells[5][i] = FloatToStr(p[2].x);
                        StringGrid1->Cells[6][i] = FloatToStr(p[2].y);
                        StringGrid1->RowCount += 1;
 
                        Series1->AddXY(p[0].x, p[0].y);
                        Series2->AddXY(p[1].x, p[1].y);
                        Series3->AddXY(p[2].x, p[2].y);
                        calculateForces();
                        moveBodies();
 
                        counter += h;
                        i += 1;
                }
        }
 
        if(n == 4){
                p[0].x = StrToFloat(EditX1->Text); p[0].y = StrToFloat(EditY1->Text);
                m[0] = StrToFloat(EditM1->Text);
                v[0].x = StrToFloat(EditVX1->Text); v[0].y = StrToFloat(EditVY1->Text);
 
                p[1].x = StrToFloat(EditX2->Text); p[1].y = StrToFloat(EditY2->Text);
                m[1] = StrToFloat(EditM2->Text);
                v[1].x = StrToFloat(EditVX2->Text); v[1].y = StrToFloat(EditVY2->Text);
 
                p[2].x = StrToFloat(EditX3->Text); p[2].y = StrToFloat(EditY3->Text);
                m[2] = StrToFloat(EditM3->Text);
                v[2].x = StrToFloat(EditVX3->Text); v[2].y = StrToFloat(EditVY3->Text);
 
                p[3].x = StrToFloat(EditX4->Text); p[3].y = StrToFloat(EditY4->Text);
                m[3] = StrToFloat(EditM4->Text);
                v[3].x = StrToFloat(EditVX4->Text); v[3].y = StrToFloat(EditVY4->Text);
 
                while (counter < T){
                        StringGrid1->Cells[0][i] = FloatToStrF(counter, ffGeneral, 4, 4);
                        StringGrid1->Cells[1][i] = FloatToStr(p[0].x);
                        StringGrid1->Cells[2][i] = FloatToStr(p[0].y);
                        StringGrid1->Cells[3][i] = FloatToStr(p[1].x);
                        StringGrid1->Cells[4][i] = FloatToStr(p[1].y);
                        StringGrid1->Cells[5][i] = FloatToStr(p[2].x);
                        StringGrid1->Cells[6][i] = FloatToStr(p[2].y);
                        StringGrid1->Cells[7][i] = FloatToStr(p[3].x);
                        StringGrid1->Cells[8][i] = FloatToStr(p[3].y);
                        StringGrid1->RowCount += 1;
 
                        Series1->AddXY(p[0].x, p[0].y);
                        Series2->AddXY(p[1].x, p[1].y);
                        Series3->AddXY(p[2].x, p[2].y);
                        Series4->AddXY(p[3].x, p[3].y);
                        calculateForces();
                        moveBodies();
 
                        counter += h;
                        i += 1;
                }
        }
        StringGrid1->RowCount -= 1;        
}
//---------------------------------------------------------------------------
 
void TForm1::calculateForces()
{
        double distance = 0, magnitude = 0;
        point direction;
        for(int i = 0; i < n - 1; i++){
        for(int j = i + 1; j < n; j++){
                distance = sqrt( pow((p[i].x - p[j].x), 2.0) +
                                 pow((p[i].y - p[j].y), 2.0) );
                magnitude = (G * m[i] * m[j]) / pow(distance, 2.0);
                direction.x = p[j].x - p[i].x;
                direction.y = p[j].y - p[i].y;
                f[i].x = f[i].x + magnitude * direction.x / distance;
                f[j].x = f[j].x - magnitude * direction.x / distance;
                f[i].y = f[i].y + magnitude * direction.y / distance;
                f[j].y = f[j].y - magnitude * direction.y / distance;
        }
        }
}
 
void TForm1::moveBodies()
{
        point deltav;
        point deltap;
        for(int i = 0; i < n; i++){
                deltav.x = f[i].x / m[i] * h;
                deltav.y = f[i].y / m[i] * h;
 
                deltap.x = (v[i].x + deltav.x / 2) * h;
                deltap.y = (v[i].y + deltav.y / 2) * h;
 
                v[i].x = v[i].x + deltav.x;
                v[i].y = v[i].y + deltav.y;
 
                p[i].x = p[i].x + deltap.x;
                p[i].y = p[i].y + deltap.y;
 
                f[i].x = 0.0; f[i].y = 0.0;
        }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2018, 23:55
Ответы с готовыми решениями:

Работа с динамической памятью
люди выручите меня, я только недавно начал изучать язык СИ, и еще не знаю как делать задачи вот такого типа: Дана квадратная матрица A...

Помогите пожалуйста решить задачу с динамической памятью и указателями
Тема: Структуры, указатели. Цель работы: научиться работать с указателями, описать структуру, использовать в программе динамическую...

Ошибка при работе с динамической памятью - 'Invalid pointer operatoion'
Столкнулся с такой проблемой - код исполняется правильно, но при закрытие программы вываливается ошибка(скрин прилогается). Я нашёл...

5
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
18.12.2018, 00:13
Milipops, А динамическая память тут при чем? Где то на 0 делите или очень близкое к нулю значение.
0
0 / 0 / 2
Регистрация: 06.02.2015
Сообщений: 67
18.12.2018, 00:20  [ТС]
Fulcrum_013, я думал проблема в том, что массивы не освобождаются. Просто при первом нажатии все считается отлично, а если нажать несколько раз, то появляются ошибки
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,012
18.12.2018, 00:22
Если точнее, то ошибка переполнения при возведении в степень или ошибка операции с плавающей точкой.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
18.12.2018, 02:29
Лучший ответ Сообщение было отмечено Milipops как решение

Решение

Цитата Сообщение от Milipops Посмотреть сообщение
что массивы не освобождаются
если бы массивы не освобождались то винда конкретно присела бы на своп без всяких экскепшинов. Если бы по битым ссылкам (удаленным массивам) обращение было был бы алес капут в виде segmentation fault. а так просто переполнение разрядной сетки.

Добавлено через 4 минуты
Milipops, Зачем извлекать корень из дистанции чтобы тут же возводить ее в квадрат?

Добавлено через 56 секунд
Milipops, Вы это на конкурс что ли изобретаете?

Добавлено через 8 минут
Цитата Сообщение от Milipops Посмотреть сообщение
я думал проблема в том, что массивы не освобождаются
Это конечно огромная проблема - в данном случае при каждом нажатии теряется до 256 байт памяти включая накладные расходы в виде разметки блоков потерянных и т.д. Но когда объектов будет побольше потечет поконкретней.
Вообще если максимально количество элементов ограничено зачем массивы динамические?
1
0 / 0 / 2
Регистрация: 06.02.2015
Сообщений: 67
18.12.2018, 03:16  [ТС]
Fulcrum_013, нет, не на конкурс, задания для универа) Спасибо, попробую сделать статическими.

Добавлено через 5 минут
Fulcrum_013, да, действительно, статические массивы решают проблему, еще раз спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.12.2018, 03:16
Помогаю со студенческими работами здесь

SOS SOS!!! Ошибки с динамической памятью...
ЗДРАВСТВУЙТЕ однофорумчане.... У меня такая вот проблемка... Я пишу синтаксический анализатор арифметических выражений. Суть проста -...

Задачка с динамической памятью и вводом из файла
Здраствуйте...Помогите написать любую программу с использованием динамической память и ввода из файла...на c++ версии вроде 3.1 досовский...

Работа с динамической памятью
Нужно наименьший элемент каждой строки, начиная со второй заменить наибольшим элементом предшествующей строки. Ошибка в том, что программа...

Рвбота с динамической памятью
Создать массив в динамической памяти A(n). Найти сумму элементов,которые кратны 5.

Работа с динамической памятью
Помогите разобраться :) Задача: Создать стек. Написать функцию, определяющую, есть ли заданная компонента в стеке. Что такое...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru