*.exe привело в действие точку остановка
12.07.2010, 11:19. Показов 2104. Ответов 0
при выполнении отладки VC 2010 express выдаёт ошибку: "*.exe привело в действие точку остановка". Что это за ошибка и где её искать? если нужно:
Задание
17. Библиотека для моделирования систем массового обслуживания
Написать библиотеку классов для моделирования включающую следующие
классы:
-- Генератор объектов
тип генерируемого объекта
(объекты в системе представляются номером типа)
среднее время появления
тип случайного распределения - равномерное
включить/выключить
кол-во сгенерированных объектов
процедура, вызываемая при генерации объекта
-- Очередь объектов к устройству обслуживания
добавить объект
взять объект
текущее число объектов в очереди
максимальное, минимальное, среднее
времени ожидания в очереди (расчет при моделировании)
максимальная длина очереди (расчет при моделировании)
-- Устройство обслуживания
поставить объект на обработку
среднее время обработки
тип случайного распределения - равномерное
работает/простаивает
коэффициент загрузки (расчет при моделировании)
кол-во обработанных объектов
процедура, вызываемая при завершении обработки объекта
-- Система в целом
количество объектов в системе
добавить объект в систему
удалить объект из системы
интервал моделирования
текущее время
процедура, вызываемая при завершении интервала моделирования
-- Очередь событий в системе
Написать модель следующей системы:
На карьере работает 2 экскаватора и M машин. В начальный момент
машины поровну делятся между очередями экскаватора. Экскаватор
наполняет кузов машины за 6-10 минут (распределение времени
равномерное). Машина отвозит песок потребителю за 45 минут
(распределение нормальное со стандартным отклонением 15 минут или 30-60 минут).
После возвращения становится под загрузку простаивающего
экскаватора или в самую маленькую очередь. Промоделировать систему
в течении 8 часов при различных M и выбрать M минимизирующее
простой экскаваторов и машин.
Для моделирования поездки машины к потребителю можно
использовать генератор, который необходимо включать, а после
генерации объекта выключать. А можно сделать M устройств обслуживания .
код
MyLib.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
| namespace kurs17
{
class system_queue //класс очереди событий в системе
{
int queue[999][3]; //очередь событий в системе
public:
system_queue(); //конструктор
void set_queue (int t1, int t2, int p); //добавить элмент в очередь
int first (int fl) const; //возвращает значение колонки (fl) первого элемента
void execute (); //удалаяет первый элемент из очереди
};
class generator //класс объектов
{
int tA; //мин. время генерации
int tB; //макс. время генерации
int m; //количество созданных объектов
struct trucks //объекты системы
{
int type; //тип объекта
int num; //порядковый номер
trucks *next;
trucks *back;
}*beg, *end, *cur;
void (*Gen)(); //процедура, вызываемая при генерации объекта
public:
generator (void (*_Gen)(), int A, int B); //конструктор
void setM (int t); //увеличение количества объектов
};
class service_device //класс обслуживающих устройств
{
int lA; //минимальное время обработки
int lB; //количество погрузчиков
int loaded; //количество обработанных объектов
bool busy; //флаг занятости устройства
struct alpha //коэффициент загруженности устройства
{
int percent; //в процентах
int wt_time; //общее время ожидания
int ld_time; //общее время работы
} *a;
public:
service_device (void (*_Ser)(), int A, int B); //конструктор
void (*Ser)(); //процедура, вызываемая при завершении обработки объекта
int next(); //поставить объект на обработку
bool isBusy(); //тест на занятость устройств
void setBusy(); //установка флага занятости
void setloaded (); //устанавливает количество обработанных устройством объектов
int getloaded (); //возвращает количество обработанных устройством объектов
int getA (); //возвращает коэф. загруженности УО
void setA (int fl, int t); //рассчёт коэффициента занятости устройства
};
class queue //класс очереди объектов к обслуживающим устройствам
{
int len; //максимальная длина очереди
int n; //текущее количество объектов в очереди
struct mid //среднее время ожидания
{
int time; //суммарное время ожидания
int N; //количество ожидавших
double result;
}*m;
int min; //минимальное время ожидания
int max; //максимальное время ожидания
public:
queue (); //конструктор
void add (); //принимает объект в очередь
void give (int t); //отдаёт объект свободному устройству
int get_maxT (); //возвращает максимальное время ожидания
int get_minT (); //возвращает минимальное время ожидания
double get_midT (); //возвращает среднее время ожидания
int get_n (); //возвращает текущее число объектов в очереди
};
class System //класс системы в целом
{
int t; //интервал моделирования
long time; //текущее время
int m; //количество объектов
void (*Sys)(); //процедура, вызываемая при завершении интервала моделирования
public:
System (int T, void (*_Sys)()); //конструктор
void set_m (); //добавление объекта в систему
void delobj (); //удаление объекта из системы
int get_m (); //возвращает количество объектов в системе
int get_time (); //возвращает текущее время
void set_time (); //переходит к следующей единице времени
};
} |
|
MyLib.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
| #include "MyLib.h"
#include <stdexcept>
#include <conio.h>
namespace kurs17
{
system_queue::system_queue ()
{
for (int i=0; i<99; i++)
for (int j=0; j<3; j++)
queue[i][j]=0;
}
void system_queue::set_queue (int p1, int p2, int p3)
{
int i=0;
for (; i<98 && queue[i][1]!=0 && queue[i][1]<=p2; i++);
int j=i;
for (; j<98 && queue[j][1]!=0; j++);
for (; j>=i; j--)
{
queue[j+1][0]=queue[j][0];
queue[j+1][1]=queue[j][1];
queue[j+1][2]=queue[j][2];
}
queue[i][0]=p1;
queue[i][1]=p2;
queue[i][2]=p3;
}
int system_queue::first (int p) const {return queue[0][p];}
void system_queue::execute ()
{
for (int j=0; j<98 && queue[j][1]!=0; j++)
{
queue[j][0]=queue[j+1][0];
queue[j][1]=queue[j+1][1];
queue[j][2]=queue[j+1][2];
}
}
generator::generator (void (*_Gen)(), int A, int B)
{
tA=A;
tB=B;
Gen=_Gen;
m=0;
beg= new trucks;
end=cur=beg;
beg->back=NULL;
beg->next=NULL;
beg->num=-1;
beg->type=-1;
}
void generator::setM (int t)
{
cur->num=m;
cur->type=t;
cur->next=new trucks;
end=cur->next;
end->back=cur;
cur=end;
m++;
}
service_device::service_device (void (*_Ser)(), int A, int B)
{
lA=A;
lB=B;
Ser=_Ser;
a=new alpha;
a->ld_time=0;
a->percent=0;
a->wt_time=0;
busy=0;
loaded=0;
}
int service_device::next()
{
setBusy();
return rand()%(lB-lA+1)+lA;
}
bool service_device::isBusy() {return busy;}
void service_device::setBusy() {busy=!isBusy();}
void service_device::setloaded () {loaded++;}
int service_device::getloaded () {return loaded;}
int service_device::getA()
{
a->percent=(a->ld_time/(a->ld_time+a->wt_time))*100;
return a->percent;
}
void service_device::setA (int fl, int t)
{
if (fl) a->ld_time+=t;
else a->wt_time+=t;
}
queue::queue ()
{
n=min=max=0;
m=new mid;
m->N = m->result = m->time = 0;
}
void queue::add ()
{
n++;
m->N++;
if (len<n) len=n;
}
void queue::give (int t)
{
n--;
m->time+=t;
if (max<t) max=t;
if (min>t) min=t;
}
int queue::get_maxT () {return max;}
int queue::get_minT () {return min;}
double queue::get_midT ()
{
m->result = (double) m->time/m->N;
return m->result;
}
int queue::get_n () {return n;}
System::System (int T, void (*_Sys)())
{
Sys=_Sys;
t=T;
m=0;
time=-1;
}
void System::set_m () {m++;}
void System::delobj () {m--;}
int System::get_m () {return m;}
void System::set_time () {time++; if (time==t*60) Sys();}
int System::get_time () {return time;}
} |
|
MyProg.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
| // kursovoy17.cpp: определяет точку входа для консольного приложения.
#include <iostream>
#include <time.h>
#include <conio.h>
#include "MyLib.h"
using namespace std;
using namespace kurs17;
const int tA=30; //минимальное время транспортировки груза
const int tB=60; //максимальное время транспортировки груза
const int lA=6; //минимальное время загрузки погрузчика
const int lB=10; //максимальное время загрузки погрузчика
generator *g;
service_device *sd[2];
service_device *tr[20];
System *s;
queue *q[2];
system_queue *sq;
void gen_proc ()
{
int N=1; //номер типа
g->setM(N);
s->set_m();
if (!sd[0]->isBusy()) sq->set_queue(0, sd[0]->next(), 1);
else if (!sd[1]->isBusy()) sq->set_queue(0, sd[1]->next(), 2);
else
{
if (q[0]->get_n() > q[1]->get_n())
{
q[1]->add();
sq->set_queue(0, 1, -2);
}
else
{
q[0]->add();
sq->set_queue(0, 1, -1);
}
}
}
void ser_proc ()
{
int proc=sq->first(2);
if (proc==1 || proc==2)
{
if (sd[proc-1]->isBusy())
{
sd[proc-1]->setA(1, sq->first(1)-sq->first(0));
sd[proc-1]->setBusy();
sd[proc-1]->setloaded();
int i=0;
for (; i<20 && tr[i]->isBusy(); i++);
sq->set_queue(s->get_time(),s->get_time() + tr[i]->next(), i+10);
sq->execute();
if (q[proc-1]->get_n())
{
q[proc-1]->give(sq->first(1) - sq->first(0));
int ldt=sd[proc-1]->next();
sq->set_queue(s->get_time(), s->get_time() + ldt, proc);
sd[proc-1]->setA(1, ldt);
}
else sq->set_queue(s->get_time(), s->get_time()+1, proc);
}
else
{
if (q[proc-1]->get_n())
{
sd[proc-1]->setA(0, sq->first(1) - sq->first(0));
q[proc-1]->give(sq->first(1) - sq->first(0));
sq->set_queue(s->get_time(), s->get_time() + sd[proc-1]->next(), proc);
}
else sq->set_queue(sq->first(0), s->get_time()+1, proc);
}
}
else
{
if (q[0]->get_n() > q[1]->get_n())
{
q[1]->add();
sq->set_queue(s->get_time(), s->get_time()+1, -2);
}
else
{
q[0]->add();
sq->set_queue(s->get_time(), s->get_time()+1, -1);
}
}
}
void sys_proc ()
{
int m = s->get_m();
int min=q[0]->get_minT();
if (min>q[1]->get_minT()) min=q[1]->get_minT();
int max=q[0]->get_maxT();
if (max<q[1]->get_maxT()) max=q[1]->get_maxT();
double mid = (q[0]->get_midT()+q[1]->get_midT())/2;
//int a=(sd[0]->getA()+sd[1]->getA())/2;
int a=100;
int l=sd[0]->getloaded() + sd[1]->getloaded();
cout <<"trucks: "<<m<<"\nWaiting time:\n\tmin: "<<min<<"\n\tmid: "<<mid<<"\n\tmax: "<<max<<"\nLoaders: 2\nLoaded: "<<l<<"\nAlpha: "<<a<<"%\n\n";
}
int main()
{
srand (time(0));
int m=8; //количество машин
int n=2; //количество эксковаторов
int t=8; //интервал моделирования
for (m=8; m<15; m++)
{
g=new generator (gen_proc,0,0);
sd[0]=new service_device(ser_proc, lA, lB);
sd[1]=new service_device(ser_proc, lA, lB);
q[0]=new queue ();
q[1]=new queue ();
sq=new system_queue ();
for (int i=0; i<20; i++)
{
tr[i]=new service_device (ser_proc, tA, tB);
}
s=new System (t, sys_proc);
for (int i=0; i<m; i++) gen_proc ();
int T=t*60;
for ( ; s->get_time()<T; s->set_time() )
{
while (sq->first(1)==s->get_time())
{
if (sq->first(2)>0) ser_proc();
else sq->set_queue(sq->first(0), s->get_time()+1, sq->first(2));
sq->execute();
}
}
//s->set_time();
}
_getch();
return 0;
} |
|
Добавлено через 1 час 18 минут
если такую ошибку тяжело отыскать, хотя бы скажите из-за чего она может возникнуть, пожалуйста...
0
|