Симуляционная программа

Я делаю симуляцию для нескольких очередей.
Я должен вначале ввести количество очередей, а затем смоделировать весь тус.

Выходные данные для каждой очереди в каждом «раунде» — это время, общее количество обслуженных и размер каждой очереди.

Моя программа не работает и не отвечает.

Выписывает первую очередь оч потом вылетает …

Помогите!

Я думаю, что мои расчеты неверны, но я не знаю, так как все это терпит крах.

Вот:

#include <iostream>
#include <cstdlib>
#include <list>
#include <ctime>
#include<conio.h>
#include <time.h>
#include <stdlib.h>
#include<dos.h>
#include<windows.h>using namespace std;

class Customer
{
public:

int servicet;
int served;

Customer()
{
servicet= rand()%150+30;
}

int getServicetime()
{
return servicet;
}

int getServed()
{
return served;
}int decreaseServeTime()
{
servicet --;
}

};int totServed=0;
int queues=0;
int inLine=0;
int totTime=0;
int smallestQueue=0;
int temp=0;
int ran=0;
double mean=0;
int served=0;
int serviceTime=0;
int help=0;
int sim=0;
int n=0;
using namespace std;
int main()
{
cout<<"Number of Cashiers?: "<<endl;
cin >> queues;
cout <<"How long simulation?: "<<endl;
cin >> sim;

list<Customer> *cashiers[queues];
list<Customer> *cust;for(int i=0; i<=queues; i++)
{
cust = new list<Customer>;
cashiers[i] = cust;}

srand(time(0));
while(n<sim)
{
Sleep(2000);ran= rand()%4;
smallestQueue = cashiers[0] ->size();

for(int j=0; j<ran; j++)
{
for(int k=0; k<queues; k++)
{
temp = cashiers[k]->size();

if(temp<=smallestQueue)
{
smallestQueue = temp;

help=k;
}
}

Customer C;

cashiers[help]->push_back(C);
inLine++;

}

for(int i=0; i<queues; i++)
{
if(serviceTime>0)
{

serviceTime = cashiers[i]->front().getServicetime();
cashiers[i]->front().decreaseServeTime();

}
else if(serviceTime==0)
{
cashiers[i]->pop_front();
served++;
}
}

totTime++;
int cash=1;
for(int i=0; i<queues; i++)
{
if(inLine!=0)
{
cout <<"Kassa: "<<cash<<endl;
inLine = cashiers[i]->size();
mean = (totTime/inLine);
totServed +=served;
cash++;}
cout <<inLine<<" "<<mean<<" "<<totServed<<endl;
}n++;
}

system("pause");}

0

Решение

Я рекомендую вам использовать такую ​​программу, как Application Verifier, чтобы найти проблему, вызывающую сбой:

http://www.microsoft.com/en-us/download/details.aspx?id=20028

Важно, чтобы вы научились отлаживать свое программное обеспечение и понимать, что происходит. Пожалуйста, запустите ваш код в отладчике (Visual Studio, Eclipse) и посмотрите, где он останавливается. Если вы использовали Application Verifier, то он, скорее всего, остановится там, где возникла проблема. Посмотрите на переменные и посмотрите, имеют ли они смысл. Посмотрите, есть ли у вас доступ к ячейкам памяти, которые вы не должны.

Чтобы использовать Application Verifier с Visual Studio, установите его, затем найдите appVerifier.exe в папке System32 в C: \ Windows. Затем откройте файл и укажите его на свой исполняемый файл. Включите то, что вы считаете правильными проверками. Затем запустите его в Visual Studio.

2

Другие решения

Хорошее место для начала — отладчик (например, gdb). Сначала мы компилируем с включенной отладкой (g++ -ggdb) и попробуйте запустить в отладчике,

 $ g++ hi.cpp  -ggdb
$ gdb ./a.out
GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/ben/a.out...done.
(gdb) run
Starting program: /home/ben/a.out
Number of Cashiers?:
5
How long simulation?:
5
Kassa: 1

Program received signal SIGSEGV, Segmentation fault.
0x0000000000401827 in std::_List_const_iterator<Customer>::operator++ (
this=0x7fffffffdd10) at /usr/include/c++/4.7/bits/stl_list.h:236
236        _M_node = _M_node->_M_next;
(gdb) backtrace
#0  0x0000000000401827 in std::_List_const_iterator<Customer>::operator++ (
this=0x7fffffffdd10) at /usr/include/c++/4.7/bits/stl_list.h:236
#1  0x0000000000401665 in std::__distance<std::_List_const_iterator<Customer> >
(__first=..., __last=...)
at /usr/include/c++/4.7/bits/stl_iterator_base_funcs.h:82
#2  0x0000000000401492 in std::distance<std::_List_const_iterator<Customer> > (
__first=..., __last=...)
at /usr/include/c++/4.7/bits/stl_iterator_base_funcs.h:118
#3  0x000000000040135b in std::list<Customer, std::allocator<Customer> >::size
(this=0x604010) at /usr/include/c++/4.7/bits/stl_list.h:855
#4  0x0000000000401122 in main () at hi.cpp:125

Здесь мы видим, что программа завершилась с ошибкой сегментации в
функция std::list, После программирования на некоторое время вы будете
получить интуицию, что это, вероятно, из-за вытаптывания вашей программы
на некоторой памяти это не должно быть. Определив примерно природу
проблемы, теперь мы перейдем к valgrind, инструмент для отслеживания
в частности, такого рода проблемы.

 $ valgrind ./a.out
==13751== Memcheck, a memory error detector
==13751== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==13751== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==13751== Command: ./a.out
==13751==
Number of Cashiers?:
5
How long simulation?:
5
Kassa: 1
==13751== Invalid read of size 8
==13751==    at 0x401422: std::list<Customer, std::allocator<Customer> >::begin() const (stl_list.h:749)
==13751==    by 0x40134F: std::list<Customer, std::allocator<Customer> >::size() const (stl_list.h:855)
==13751==    by 0x401121: main (hi.cpp:125)
==13751==  Address 0x5a06040 is 0 bytes inside a block of size 16 free'd
==13751==    at 0x4C2A44B: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13751==    by 0x4018E7: __gnu_cxx::new_allocator<std::_List_node<Customer> >::deallocate(std::_List_node<Customer>*, unsigned long) (new_allocator.h:100)
==13751==    by 0x4017D9: std::_List_base<Customer, std::allocator<Customer> >::_M_put_node(std::_List_node<Customer>*) (stl_list.h:339)
==13751==    by 0x4015C0: std::list<Customer, std::allocator<Customer> >::_M_erase(std::_List_iterator<Customer>) (stl_list.h:1549)
==13751==    by 0x4013E9: std::list<Customer, std::allocator<Customer> >::pop_front() (stl_list.h:983)
==13751==    by 0x40108B: main (hi.cpp:113)
==13751==
==13751==
==13751== Process terminating with default action of signal 8 (SIGFPE)
==13751==  Integer divide by zero at address 0x402CCCE98
==13751==    at 0x40113C: main (hi.cpp:126)

Здесь мы видим valgrind говорит нам, что ваша программа пыталась прочитать
операция на нераспределенной памяти. В частности, это, кажется,
происходит в результате pop_front операция. Глядя на
источник, вы действительно пытаетесь выскочить из cashiers[i] без первого
проверяя его размер.

Мы можем добавить соответствующую проверку,

 ...
else if(serviceTime==0)
{
if (!cashiers[i]->empty()) {
cashiers[i]->pop_front();
served++;
}
}
...

Однако настоящей причиной аварии является деление на ноль при вычислении
meanкак отмечено в конце valgrindвыходной. Это связано с тем, что в случае, когда нет Customers являются inLine не обрабатывается при вычислении mean,

2

По вопросам рекламы [email protected]