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

Почему программа компилируется но не работает? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
01.12.2012, 22:38     Почему программа компилируется но не работает? #1
Заявки (телевизоры) поступают на проверку к 3 пунктам контроля . Если все контроллеры заняты , заявки встают в очередь . Если заявка пребывает в очереди больше 35 минут , она не обслуживается.
8-1.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
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
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
#include "List.h"     //подключение файла с описанием шаблона списка
 
int brak=0;           //счетчик случаев выбраковки изделий в пункте
                      //контроля
 
float que1_aver;      //переменная для подсчета средней длины очереди
                      //к пункту контроля
long int total;       //счетчик модельного времени (количество секунд)
long int completed;   //счетчик числа заявок, завершивших обслуживание
                      //(телевизоров, ушедших на упаковку)
long int entered;     //счетчик числа заявок, поступивших в систему
//Класс для представления заявок (телевизоров)
class TV
{
 long int id;         //уникальный идентификатор заявки
 int seconds;         //время, проведенное в системе
  public:
//Объявление классов Control и Debugger дружественными
 friend class Control;
 
 TV()                 //метод-конструктор
 {
  id=entered;         //какой по счету поступила заявка, такой
                      //и идентификатор
  seconds=0;
 }
  void Print();
  long int getId();
  int getTime();
   };
//Вывод содержимого объекта
void TV::Print()
 {
  printf("id=%ld\n проведено в системе=%d секунд\n", id, seconds); 
 }
//Чтение идентификатора заявки
 long int TV::getId()
 {
  return(id); 
 }
//Чтение проведенного в системе времени
 int TV::getTime()
 {
  return(seconds); 
 }
//Протокол класса Пункт_контроля
class Control
{
 int to_arrival;                 //время до прибытия следующей заявки извне
 int q_length;                   //текущая длина очереди
 ListNode<TV> *queue;            //список заявок, находящихся в очереди
 int *to_served;                 //массив времен, оставшихся до завершения
                                 //обслуживания заявки в каждом из каналов,
                                 //в случае простоя -1
 TV **serving;                   //массив указателей на заявки, находящиеся
                                 //на обслуживании в каналах, в случае
                                 //простоя канала NULL
 
  const static int arr1=42;     //минимальное время между прибытиями заявок
                                 //извне
  const static int arr2=55;     //максимальное время между прибытиями
                                 //заявок извне
  const static int serv1=60;    //минимальное время проверки телевизора
  const static int serv2=180;    //максимальное время проверки телевизора
  const static int volume=3;     //количество каналов (контролеров)
 
   public:
  Control();                     //конструктор
  ~Control();                    //деструктор
  void run();                    //диспетчер
  void arrival(TV *);           //прибытие телевизора на проверку
 
  void complete(int i);          //завершение проверки телевизора
  int busy();                    //вычисление числа занятых контролеров
 };
 
 
 
 
 Control::Control()//Конструктор для пункта контроля
 {
  int i;
  q_length=0;
  queue=NULL;
  //Розыгрыш интервала времени до прибытия заявки
  to_arrival=arr1+rand()%(arr2-arr1+1);
//Выделение памяти под массивы
  to_served=new int[volume];;
  serving=new TV *[volume];
//Инициализация массивов
  for(i=0;i<volume;i++)  to_served[i]=-1;
  for(i=0;i<volume;i++)  serving[i]=NULL;
 }
//Деструктор для пункта контроля
 Control::~Control()
 {
  delete[] to_served;
  delete [] serving;
 }
 //Вычисление числа занятых контролеров
 int Control::busy()
 {
  int i, k;
  k=0;
//Признак занятости: положительное время, оставшееся до завершения //Проверки телевизора
  for(i=0;i<volume;i++)
   if (to_served[i]>0) k++;
  return(k);
 }
//Прибытие телевизора для прохождения контроля 
 void Control::arrival(TV *)
 {
  int i,a;      
  TV *p;
  ListNode<TV> *ptr;
  
  
   entered++;                    //инкремент счетчика поступлений в систему
   p=new TV();                   //создание нового объекта-телевизора
//Розыгрыш нового интервала времени между поступлениями
   to_arrival=arr1+rand()%(arr2-arr1+1); 
  
  
 //Поиск свободного контролера
  for (i=0;i<volume;i++)
   if (to_served[i]==-1) break;
//Свободный контролер найден
 
  if (i<volume)
  {
  //Ставим телевизор к нему на обслуживание
      do {
   serving[i]=p;
   a=serving[i]->getTime();
  if (a>2100) brak++;}
  while (a<=2100);
//Разыгрываем время обслуживания
   to_served[i]=serv1+rand()%(serv2-serv1+1);
  }
  else                           //все контролеры заняты
  {
  //Создаем элемент списка для постановки телевизора в очередь
   ListNode<TV> *ptr=new ListNode<TV>(p,NULL);
 //Если очередь пуста, делаем его головой списка
   if (q_length==0) queue=ptr;
//иначе ставим в конец очереди (хвост списка)
   else ListAdd<TV>(queue,ptr);
   q_length++;                   //инкремент длины очереди
  }
  return;
 }
 //Завершение проверки телевизора i-м контролером
 void Control::complete(int i)
 {
  int a; 
 //Телевизор успешно прошел проверку
 
  
   completed++;                  //инкремент счетчика телевизоров,
                                 //покинувших систему
 
//Удаление объекта из системы
   delete serving[i]; 
  
  
 //Попытка загрузить освободившегося контролера
  if (q_length==0)               //очередь пуста
  {
 //Контролер объявляется простаивающим
   to_served[i]=-1; 
   serving[i]=NULL;
  }  
  else                           //очередь не пуста
  {
  //Извлекаем из очереди первый телевизор и ставим его на проверку
 do {
   serving[i]=queue->Data();
   a=serving[i]->getTime();
  if (a>2100) brak++;
 }
  while (a<=2100);  
      
//Разыгрываем время  проверки
   to_served[i]=serv1+rand()%(serv2-serv1+1);
//Головой списка-очереди становится следующий телевизор
   queue=queue->Next();
   q_length--;                   //декремент текущей длины очереди
  }
 }
//Метод-диспетчер 
 void Control::run()
 {
  int i; 
  float a; 
  ListNode<TV> *ptr;
//Декремент времени, оставшегося до завершения проверки каждым контролером
  for(i=0;i<volume; i++)
  {
   if (to_served[i]==-1) continue;   //контролер простаивает, декремент
                                     //не нужен
   --to_served[i];
//Вызов метода-обработчика, имитирующего завершение проверки
   if (to_served[i]==0) complete(i);  }
  to_arrival--;
//Вызов метода-обработчика, имитирующего прибытие нового телевизора
  if (to_arrival==0) arrival(NULL); 
 
//Инкремент длительности пребывания в системе для телевизоров, ожидающих 
  //проверки в очереди (если очередь не пуста)
  if (queue)
 
  {
   ptr=queue;
   while(ptr!=NULL)
  
    ((ptr->Data())->seconds)++;
    ptr=ptr->Next();
  }
 
 
  return;
 
}
8-2.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
#define N 259200  //общее время моделирования - 3-е суток
#include "8-1.h"
int main()
{
 
//Инициализация генератора случайных чисел
 srand((unsigned)time(0));
//Инициализация объектов
 Control c;
 
 for(total=0L;total<N;total++)
 {
  c.run();
  }
 
//Вывод на печать результатов имитационного эксперимента
 printf("Всего поступлений в систему %ld\n", entered);
 printf("Успешно прошли проверку %ld\n", completed);
 printf("Число неудачных проверок %d\n", brak);
 
 
system("pause");
}
List.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
template <class Type>
class ListNode  {
 private:
  ListNode<Type> *next;
  Type *data;
 public:
   ListNode(Type *d, ListNode<Type> *n); 
  ~ListNode();
  Type *Data();
  ListNode<Type> *Next();
  void  PutNext(ListNode<Type> *n);  
  void Print();
};
template <class Type>
ListNode<Type>::ListNode(Type *d, ListNode<Type> *n) : next(n), data(d)
{
}
template <class Type>
ListNode<Type>::~ListNode()
{
 delete data;
}
template <class Type>
Type *ListNode<Type>::Data()
{
 return data;
}
template <class Type>
ListNode<Type> *ListNode<Type>::Next()
{
 return next;
}
template <class Type>
void ListNode<Type>::PutNext(ListNode<Type> *n)
{
 next=n;
}
template <class Type>
void ListNode<Type>::Print()
{
 data->Print();
}
template <class Type>
void ListAdd(ListNode<Type> *head, ListNode<Type> *li)
{
 ListNode<Type> *old, *v;
 for (v=head; v!=NULL; v=v->Next())
  old=v;
 old->PutNext(li);
}
template <class Type>
ListNode<Type> *ListDelete(ListNode<Type> *head, ListNode<Type> *li)
{
 int j;
 ListNode<Type> *old, *o1;
 if (li==head)
 {
  o1=head->Next();
  delete li;
  return o1;
 }
 for (ListNode<Type>* v=head; v!=li; v=v->Next())
  old=v;
 o1=li->Next();
 old->PutNext(o1);
  delete li;
 return head;
}
template <class Type>
void ListPrint(ListNode<Type> *head)
{
 for (ListNode<Type>* v=head; v!=NULL; v=v->Next())
    v->Print();
 } 
template <class Type>
int ListCount(ListNode<Type> *head)
{
 int i; i=0;
 for (ListNode<Type>* v=head; v!=NULL; v=v->Next())
 {
   v->Print();
   i++;
 }
 return i;
}
Добавлено через 3 часа 48 минут
нашел ошибку
C++
1
2
3
4
5
do {
   serving[i]=p;
   a=serving[i]->getTime();
  if (a>2100) brak++;}
  while (a<=2100);
цикл неправильно работает .... но не пойму почему..
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
03.12.2012, 17:24  [ТС]     Почему программа компилируется но не работает? #21
Ребята помогите разобраться !!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
03.12.2012, 22:28     Почему программа компилируется но не работает? #22
и так, что у вас там за ошибка была?
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
03.12.2012, 22:54  [ТС]     Почему программа компилируется но не работает? #23
Цитата Сообщение от dederkay Посмотреть сообщение
и так, что у вас там за ошибка была?
я пытался сделать проверку заявки ,при входе к контроллеру, на количество времени проведенное в очереди. Пробовал разными способами :

C++
1
2
3
4
5
if (((ptr->Data())->seconds)<=2100){
          serving[i]=p;
     }else
      {brak++;
      delete serving[i];}
остановился на этом , но что-то не так..
Выдало ошибку после запуска :Необработанное исключение в "0x00a32276" в "qq1.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000004".
и указало желтой стрелочкой на это: Код C++

C++
1
2
3
4
5
    template <class Type>
Type *ListNode<Type>::Data()
{
---> return data;
}
вы потом предложили свой вариант:
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
void Control::arrival(TV *)
{
    ListNode<TV> *ptr;
    int i,a;      
    TV *p;
 
 
    entered++;                    //инкремент счетчика поступлений в систему
    p=new TV();                   //создание нового объекта-телевизора
    //Розыгрыш нового интервала времени между поступлениями
    to_arrival=arr1+rand()%(arr2-arr1+1); 
 
 
    if (queue)
    {
        ptr=queue;
        while(ptr!=NULL)
        {
            ((ptr->Data())->seconds)++;
            ptr=ptr->Next();
        }
        for (i=0;i<volume;i++)
    {
        if (to_served[i]==-1)
        {
            break;
        }
    }
    //Свободный контролер найден
    if (i<volume)
    {
 
        //Ставим телевизор к нему на обслуживание
        if (((ptr->Data())->seconds)<=2100)
        {
            serving[i]=p;
        }
        else
        {
            brak++;
            delete serving[i];
        }
 
 
        //Разыгрываем время обслуживания
        to_served[i]=serv1+rand()%(serv2-serv1+1);
    }
    else                           //все контролеры заняты
    {
        //Создаем элемент списка для постановки телевизора в очередь
        ListNode<TV> *ptr=new ListNode<TV>(p,NULL);
        //Если очередь пуста, делаем его головой списка
        if (q_length==0) queue=ptr;
        //иначе ставим в конец очереди (хвост списка)
        else ListAdd<TV>(queue,ptr);
        q_length++;                   //инкремент длины очереди
    }
    }
    //Поиск свободного контролера
    
    return;
}
но поменялась логика и заявки просто перестали поступать на обработку...
потом я пробовал еще всякие разные варианты но успех 0..
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
03.12.2012, 23:04     Почему программа компилируется но не работает? #24
та вроде логика не поменялась, все равно при отсутствии переменной queue вылетал бы ексепшан
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
03.12.2012, 23:06  [ТС]     Почему программа компилируется но не работает? #25
Цитата Сообщение от dederkay Посмотреть сообщение
та вроде логика не поменялась, все равно при отсутствии переменной queue вылетал бы ексепшан
с виду она и вправду не поменялась, но заявки перестали попадать к контроллерам...
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
03.12.2012, 23:13     Почему программа компилируется но не работает? #26
ладно сейчас поковыряюсь и попытаюсь понять как именно должна работать программа...
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
03.12.2012, 23:26  [ТС]     Почему программа компилируется но не работает? #27
Цитата Сообщение от dederkay Посмотреть сообщение
ладно сейчас поковыряюсь и попытаюсь понять как именно должна работать программа...
есть система... к ней поступаю заявки и попадают к контроллерам на обработку, если все контроллеры заняты , то заявки попадают в очередь где ожидают освобождения одного из контроллеров, если такой появляется , то та заявка которая в очереди первая, поступает к этому контроллеру на обработку. После обработки , заявка покидает систему.

У меня здесь реализован метод arrival - прибытие заявки , и complete - завершение обслуживания . Есть два класса : Control - пункт контроля (т.е. контроллеры) и TV - класс который хранит номер заявки(id) и проведенное время ..
у меня же стоит условие что если заявка стоит в очереди больше 35 минут (2100 секунд) то ей отказывают в обслуживании ... сильно роли не играет где и как удалять заявку : бегать постоянно по очереди или просто производить проверку перед поступлением к контроллеру, это на результаты задачи не повлияет..
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
03.12.2012, 23:38     Почему программа компилируется но не работает? #28
вот первый вопрос на момент
C++
1
if (i<volume)
чему равно і?

Добавлено через 1 минуту
оно должно быть инициализированным чем? в таком случае например?

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
void Control::arrival(TV *)
{
    ListNode<TV> *ptr;
    int i,a;      
    TV *p;
 
 
    entered++;                    //инкремент счетчика поступлений в систему
    p=new TV();                   //создание нового объекта-телевизора
    //Розыгрыш нового интервала времени между поступлениями
    to_arrival=arr1+rand()%(arr2-arr1+1); 
 
    ptr=queue;
    if (queue)
    {
        
        while(ptr!=NULL)
        {
            ((ptr->Data())->seconds)++;
            ptr=ptr->Next();
        }
        for (i = 0; i < volume; i++)
        {
            if (to_served[i]==-1)
            {
                break;
            }
        }
        //Свободный контролер найден
    }
    //Поиск свободного контролера
    if (i<volume)
    {
 
        //Ставим телевизор к нему на обслуживание
        if (((ptr->Data())->seconds)<=2100)
        {
            serving[i]=p;
        }
        else
        {
            brak++;
            delete serving[i];
        }
 
 
        //Разыгрываем время обслуживания
        to_served[i]=serv1+rand()%(serv2-serv1+1);
    }
    else                           //все контролеры заняты
    {
        //Создаем элемент списка для постановки телевизора в очередь
        ListNode<TV> *ptr=new ListNode<TV>(p,NULL);
        //Если очередь пуста, делаем его головой списка
        if (q_length==0) queue=ptr;
        //иначе ставим в конец очереди (хвост списка)
        else ListAdd<TV>(queue,ptr);
        q_length++;                   //инкремент длины очереди
    }
    return;
}
вроде вернул все к истокам

Добавлено через 3 минуты
цикл не изменил значения переменной из за того что queue не существует, то i не была изменена вот программа и вылетела.

Добавлено через 2 минуты
где должна быть инициализация queue?
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
03.12.2012, 23:41  [ТС]     Почему программа компилируется но не работает? #29
Цитата Сообщение от dederkay Посмотреть сообщение
вот первый вопрос на момент
C++
1
if (i<volume)
чему равно і?

Добавлено через 1 минуту
оно должно быть инициализированным чем? в таком случае например?

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
void Control::arrival(TV *)
{
    ListNode<TV> *ptr;
    int i,a;      
    TV *p;
 
 
    entered++;                    //инкремент счетчика поступлений в систему
    p=new TV();                   //создание нового объекта-телевизора
    //Розыгрыш нового интервала времени между поступлениями
    to_arrival=arr1+rand()%(arr2-arr1+1); 
 
    ptr=queue;
    if (queue)
    {
        
        while(ptr!=NULL)
        {
            ((ptr->Data())->seconds)++;
            ptr=ptr->Next();
        }
        for (i = 0; i < volume; i++)
        {
            if (to_served[i]==-1)
            {
                break;
            }
        }
        //Свободный контролер найден
    }
    //Поиск свободного контролера
    if (i<volume)
    {
 
        //Ставим телевизор к нему на обслуживание
        if (((ptr->Data())->seconds)<=2100)
        {
            serving[i]=p;
        }
        else
        {
            brak++;
            delete serving[i];
        }
 
 
        //Разыгрываем время обслуживания
        to_served[i]=serv1+rand()%(serv2-serv1+1);
    }
    else                           //все контролеры заняты
    {
        //Создаем элемент списка для постановки телевизора в очередь
        ListNode<TV> *ptr=new ListNode<TV>(p,NULL);
        //Если очередь пуста, делаем его головой списка
        if (q_length==0) queue=ptr;
        //иначе ставим в конец очереди (хвост списка)
        else ListAdd<TV>(queue,ptr);
        q_length++;                   //инкремент длины очереди
    }
    return;
}
вроде вернул все к истокам

Добавлено через 3 минуты
цикл не изменил значения переменной из за того что queue не существует, то i не была изменена вот программа и вылетела.
заявки которые сейчас на обработке я храню в виде масива указателей на об*экт класа ТV и так как их количестов имеет заданую верхнюю границу - количетсво контроллеров. і-й елемент масива будет соответсвовать і-му контроллеру и будет хранить либо указатель, либо NULL в случае простоя контроллера.
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
03.12.2012, 23:45     Почему программа компилируется но не работает? #30
так вот на тот момент ваш список заявок, ведь они в списке, не инициализированы, а внутри условного оператора
C++
1
if (((ptr->Data())->seconds)<=2100)
вы пытаетесь достучаться до несуществующего элемента, к тому же если нет списка переменная и не будет инициализирована, поскольку она инициализируеться только в
C++
1
for (i = 0; i < volume; i++)
именно из за этого все рухнет
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
03.12.2012, 23:56  [ТС]     Почему программа компилируется но не работает? #31
а queue по-идее должна быть инициализирована перед поступлением заявки в очередь....тогда мне нужно после поступления заявки в систему сразу закидать заявку в очередь а уже потом из очереди пускать к контроллеру

Добавлено через 1 минуту
Цитата Сообщение от dederkay Посмотреть сообщение
так вот на тот момент ваш список заявок, ведь они в списке не инициализированы внутри условного оператора
C++
1
if (((ptr->Data())->seconds)<=2100)
вы пытаетесь достучаться до несуществующего елемента
так как тогда поступить?

Добавлено через 3 минуты
Цитата Сообщение от dederkay Посмотреть сообщение
так вот на тот момент ваш список заявок, ведь они в списке, не инициализированы, а внутри условного оператора
C++
1
if (((ptr->Data())->seconds)<=2100)
вы пытаетесь достучаться до несуществующего элемента, к тому же если нет списка переменная и не будет инициализирована, поскольку она инициализируеться только в
C++
1
for (i = 0; i < volume; i++)
именно из за этого все рухнет
так а как тогда мне массивы инициализировать ? мне же заявки проверять нужно..

Добавлено через 4 минуты
Цитата Сообщение от galaxyblazer Посмотреть сообщение
а queue по-идее должна быть инициализирована перед поступлением заявки в очередь....тогда мне нужно после поступления заявки в систему сразу закидать заявку в очередь а уже потом из очереди пускать к контроллеру

Добавлено через 1 минуту


так как тогда поступить?

Добавлено через 3 минуты


так а как тогда мне массивы инициализировать ? мне же заявки проверять нужно..
стоп или это не то? вы о for (i=0;i<volume;i++) в том месте где производится поиск свободного контроллера?
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.12.2012, 00:12     Почему программа компилируется но не работает? #32
и так) давайте по порядку) в списке, который называется "очередь" у нас заявки на ремонт с их идентификаторами и временем проведенным в системе?
приходит заявка в методе ту арривал? правильно? если да то она должна быть сразу там и инициализирована те внести сначала в список значение. Далее уже обработана, например рандомно придать времени в системе какоето значение, проверить не привысило ли оно норму, если да отравить куда там вы их посылаете) если нет продолжить что то делать. Вроде так?
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
04.12.2012, 00:21  [ТС]     Почему программа компилируется но не работает? #33
Цитата Сообщение от dederkay Посмотреть сообщение
и так) давайте по порядку) в списке, который называется "очередь" у нас заявки на ремонт с их идентификаторами и временем проведенным в системе?
приходит заявка в методе ту арривал? правильно? если да то она должна быть сразу там и инициализирована те внести сначала в список значение. Далее уже обработана, например рандомно придать времени в системе какоето значение, проверить не привысило ли оно норму, если да отравить куда там вы их посылаете) если нет продолжить что то делать. Вроде так?
вот рандомно придать время пробытое в системе нельзя, нужно откинуть именно ту заявку которая стояла в очереди больше 35 минут. если она стояла в очереди больше 35 минут, то ее не обслуживать а сразу убирать из системы и увеличить счетчик заявок которым отказали в обслуживании. Просто у меня четко заданое условие моей модели СМО ... в час поступает 75+-10(т.е. одна заявка прибывает в систему через каждых 42 - 55 секунд) заявок. Каждая заявка обрабативается 2+-1 минут. Если заявка стоит в очереди больше 35 минут, то ей отказывают в обслуживании. Смоделировать нужно в течении 3 суток. Если рандомно придавать пробитое время в системе, то таких заявок (которым отказали) будет очень много..
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.12.2012, 00:35     Почему программа компилируется но не работает? #34
ну в любом случае вам нужно инициализировать заявку и обработать ее, ведь так(те потратить необходимое клво времени на ее выполнение) чего в методе арривал. Как на меня так арривал должен лишь добавлять в список новый элемент, и инкрементировать некий щётчик заявок. Следующий метод должен обрабатывать заявку, например просто время инкрементить каждую секунду для всех заявок, и по истечению 2 +-1 минут удалять из списка, кторый должен быть очередью заявку. И естественно проверять не случилось ли ужасного случая когда последняя заявка превысила лимит ожиданий, когда наступит столь печальный момент говорим что появилась необработаная заявка(++бед) И удаляем ее из очереди. И вновь идем с начала. Вроде все должно быть так.
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
04.12.2012, 00:47  [ТС]     Почему программа компилируется но не работает? #35
Цитата Сообщение от dederkay Посмотреть сообщение
ну в любом случае вам нужно инициализировать заявку и обработать ее, ведь так(те потратить необходимое клво времени на ее выполнение) чего в методе арривал. Как на меня так арривал должен лишь добавлять в список новый элемент, и инкрементировать некий щётчик заявок. Следующий метод должен обрабатывать заявку, например просто время инкрементить каждую секунду для всех заявок, и по истечению 2 +-1 минут удалять из списка, кторый должен быть очередью заявку. И естественно проверять не случилось ли ужасного случая когда последняя заявка превысила лимит ожиданий, когда наступит столь печальный момент говорим что появилась необработаная заявка(++бед) И удаляем ее из очереди. И вновь идем с начала. Вроде все должно быть так.
хм... значит мне нужно создать еще один метод, например processing который будет обрабатывать заявки ?
а мой arrival будет выглядеть примерно так:?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Control::arrival(TV *)
 {ListNode<TV> *ptr;
  int i,a;      
  TV *p;
  
 
   entered++;                    //инкремент счетчика поступлений в систему
   p=new TV();                   //создание нового объекта-телевизора
//Розыгрыш нового интервала времени между поступлениями
   to_arrival=arr1+rand()%(arr2-arr1+1); 
 
    //Создаем элемент списка для постановки телевизора в очередь
   ListNode<TV> *ptr=new ListNode<TV>(p,NULL);
 //Если очередь пуста, делаем его головой списка
   if (q_length==0) queue=ptr;
//иначе ставим в конец очереди (хвост списка)
   else ListAdd<TV>(queue,ptr);
   q_length++;                   //инкремент длины очереди
  }
  return;
}
тогда есть вопросик...я смогу вот таким макаром :
C++
1
2
3
4
5
6
7
     if (((ptr->Data())->seconds)<=2100){
          { serving[i]=p;
                            }
 
     }else
     {brak++;
  delete serving[i];}
делать свою "любимую" проверку?
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.12.2012, 01:01     Почему программа компилируется но не работает? #36
а зачем вам массив обрабатываемых? к тому же переменная p в новом методе не будет существовать. а и обрабатываемые и есть те что в списке. Ведь проще проверить что то вроде такого
C++
1
2
3
4
5
if((ptr->Data()->seconds) >= 2100)//при условии что prt  указатель на последний элемент вашего списка, те он пришел последним.
{
    ++brak;
    //тут удалить последний элемент списка, который не может быть обработанным из за превышения времени
}
а и еще вы слишком мало возложили работы на ваш Лист, использовать очередь было б удобнее и париться с удалением и указателем будет немного трудно, неудобно и даже неусмесно. А можно было б просто написать queue->dequeue(); хотя решать вам)
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
04.12.2012, 01:11  [ТС]     Почему программа компилируется но не работает? #37
Цитата Сообщение от dederkay Посмотреть сообщение
а зачем вам массив обрабатываемых? к тому же переменная p в новом методе не будет существовать. а и обрабатываемые и есть те что в списке. Ведь проще проверить что то вроде такого
C++
1
2
3
4
5
if((ptr->Data()->seconds) >= 2100)//при условии что prt  указатель на последний элемент вашего списка, те он пришел последним.
{
    ++brak;
    //тут удалить последний элемент списка, который не может быть обработанным из за превышения времени
}
не совсем так... я же не могу сразу обрабатывать все заявки что находятся в очереди , мне всеравно будут нужны обработчики(контроллеры) , так как по условию у меня их три, то я смогу одновременно обрабатывать всего 3 заявки. Таково задание, по другому я делать не могу.
Цитата Сообщение от dederkay Посмотреть сообщение
а и еще вы слишком мало возложили работы на ваш Лист, использовать очередь было б удобнее и париться с удалением и указателем будет немного трудно, неудобно и даже неусмесно. А можно было б просто написать queue->dequeue(); хотя решать вам)
ну здесь да, я и вправду мало использую все прелести Листа..
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.12.2012, 01:27     Почему программа компилируется но не работает? #38
а чем вас не устроил
C++
1
#include <list>
со всеми вытекающими? о а если три одновременно обрабатывается то вы просто удаляете сначала те которые завершились. Математика же, например, пришла первая заявка, она поместилась в обрабоку, некая переменная
C++
1
l_conrollerCounts//равна 3ке
при поступлении первой заявки она декрементируется, еще заявка сново декремент. В случае когда она равна 0, мы уверенны в том что все контроллеры заняти, как только мы удалили обработанный элемент из списка, делаем инкремент, и можно вновь обрабатывать новую заявку.Не забывайте что вы работаете с глобальным временем, при ращете на приход новой заявки. Если хотите могу помочь реализовать сей "презренный кусок кода". Правда уже завтра вечерком, ибо сон нужен всем)))
galaxyblazer
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 251
05.12.2012, 01:25  [ТС]     Почему программа компилируется но не работает? #39
Цитата Сообщение от dederkay Посмотреть сообщение
а чем вас не устроил
C++
1
#include <list>
со всеми вытекающими? о а если три одновременно обрабатывается то вы просто удаляете сначала, хотя с декюв я погарячился немножко не так) но все же вам важно время. Математика же, например, пришла первая заявка, она поместилась в обрабоку, некая переменная
C++
1
l_conrollerCounts//равна 3ке
при поступлении первой заявки она декрементируется. В случае когда она равна 0, мы уверенны в том что все контроллеры заняти, как только мы удалили с начала списка элемент, делаем инкремент и можно, вновь обрабатывать новую заявку. А и очень важно нужно работать с глобальным временем, а не локальным. Если хотите могу помочь реализовать сей "презренный кусок кода". Правда уже завтра вечерком, ибо сон нужен всем)))
если все 3 контроллера заняты, заявки ожидают в очереди и ждут пока освободится один из контроллеров....
а о глобальном времени я тоже думал...но не очень люблю его..
завтра с утра сяду за этот код и вашей помощи буду очень рад!
сон и правда всем нужен) спокойной ночи)

Добавлено через 23 часа 50 минут
Цитата Сообщение от dederkay Посмотреть сообщение
а чем вас не устроил
C++
1
#include <list>
со всеми вытекающими? о а если три одновременно обрабатывается то вы просто удаляете сначала те которые завершились. Математика же, например, пришла первая заявка, она поместилась в обрабоку, некая переменная
C++
1
l_conrollerCounts//равна 3ке
при поступлении первой заявки она декрементируется, еще заявка сново декремент. В случае когда она равна 0, мы уверенны в том что все контроллеры заняти, как только мы удалили обработанный элемент из списка, делаем инкремент, и можно вновь обрабатывать новую заявку.Не забывайте что вы работаете с глобальным временем, при ращете на приход новой заявки. Если хотите могу помочь реализовать сей "презренный кусок кода". Правда уже завтра вечерком, ибо сон нужен всем)))
сегодня пробовал сделать немного по другому... вставить проверку в метод complete , получилась фигня конечно , но уже , после того как вылетал ерор я в списке локальных переменных смог увидеть что всетаки какието данные и есть в этих переменных. правда сделать программу рабочей не получилось.

Реализовать ваш совет: добавить отдельно еще метод "обработка" , вроде бы и реализовал , но еще не знаю как точно его описать в методе run.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2012, 02:07     Почему программа компилируется но не работает?
Еще ссылки по теме:

почему не компилируется программа ? C++
Почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает C++
Почему не работает программа? C++

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

Или воспользуйтесь поиском по форуму:
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
05.12.2012, 02:07     Почему программа компилируется но не работает? #40
доброго вечера, или уже ночи) Давайте вы просто скинете свой проект, ну то что на данный момент у вас получилось и мы попытаемся реализовать методы.
Yandex
Объявления
05.12.2012, 02:07     Почему программа компилируется но не работает?
Ответ Создать тему
Опции темы

Текущее время: 21:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru