我一直致力于模拟杂货店的任务,我相信它已经相对完成了但是当我编译时我得到了一个分段错误。如果你能提供一些方向或解决方案,我将是最有责任的。 谢谢, 泰勒
/*********************************************
PROGRAMMER: TAYLOR DOUTHITT
ASSIGNMENT: 5
FILE: Prog5.cc
DUE DATE: 10-5-11
USE: Contains methods defined in Prog5.h
*********************************************/
//#include "/home/onyuksel/courses/340/progs/11f/p5/prog5.h"
#include "prog5.h"
int main()
{
//initialize arrival and departure time
int custArrive, custLeave = 0;
//set clock to zero
int clock = 0;
// set count to second customer
int count = 2;
// variables to track earliest next arrival and earlist next departure
int earlyAr = 0;
int earlyDept = 0;
//variable to track next event
int earlyEvent = earlyAr;
//create list of customers
list <cust> l;
//create iterator for list
list<cust>::iterator i;
//create queue for checkout line
queue <cust> q;
//create stat object to store final statistics
stat s;
//create a customer object
cust c1;
//initilize with 1st cust data
c1.atime = 0;
c1.wtime = 0;
c1.s_checkout = start_checkout(0);
c1.id = 1;
//add to list
l.push_back(c1);
//determine earliest next event
custArrive = arr_time(clock);
earlyEvent = custArrive;
//update clock to time of next earliest event
clock = custArrive;
//Start of Simulation*********************
// while simulation is still running
while(clock < SIM_TIME)
{
// if customer is arriving
if(clock == custArrive)
{
// create object for customer
cust c;
//fill data fields
c.id = count;
c.atime = custArrive;
c.s_checkout = start_checkout( clock );
c.wtime = 0;
l.push_back( c ); // put into list
custArrive = arr_time( clock ); // calc next arrival
i = min_element(l.begin(), l.end(), cmp); // find first to enter checkout
count++; //increment customer id number
//set earliest next arrival
earlyAr = custArrive;
}
// if customer has finished picking items
else if(clock == i -> s_checkout)
{
//create object to move cust from list to queue
cust temp;
//copy values from list item to queue item
temp.id = i -> id;
temp.atime = i -> atime;
temp.wtime = i -> wtime;
temp.s_checkout = i -> s_checkout;
//insert element into queue
q.push(temp);
//if queue is empty(this is the only element about to be in queue)
if(q.size() == 1)
{
//set wait time to zero
q.front().wtime = 0;
//use dept_time to obtain departure time
custLeave = dept_time(clock);
}
//set departure as next earliest departure
earlyDept = custLeave;
}
// if customer departed
else
{
//remove customer from queue
cust c = q.front();
q.pop();
//use dept_time and update wtime of next cust in queue
q.front().wtime = clock - q.front().s_checkout;
clock += dept_time(clock);
//update stat structure
update_fin_stat( s, c, clock );
}
//determine next earliest event
// if list isnt empty
if(l.size() > 0)
{
i = min_element(l.begin(),l.end(), cmp); //find earliest checkout time
}
else
{
i -> s_checkout = (1000000); //set value to above sim-time
}
//if arrival is less than checkout time
if(earlyAr < i -> s_checkout)
{
earlyEvent = earlyAr; //earliest event is arrival
}
//else the checkout time is less than arrival
else
{
earlyEvent = i -> s_checkout; //earliest event is checkout
}
//if list not empty and departure less than earliest event
if (l.size() > 0 && earlyDept < earlyEvent)
{
earlyEvent = earlyDept; //earliest event is departure
}
// Set sim clock to next earliest event time
clock = earlyEvent;
}
print_fin_stat(s);
return 0;
}
// returns next arrival time
int arr_time (const int& clock)
{
int temp = ( rand()% ( MAX_INT_ARR - MIN_INT_ARR + 1 ) + MIN_INT_ARR );
temp += clock;
return temp;
}
// returns next departure time
int dept_time (const int& clock)
{
int temp = ( rand()% ( MAX_SERV - MIN_SERV + 1 ) + MIN_SERV );
temp += clock;
return temp;
}
// returns time to enter checkout line
int start_checkout (const int& clock)
{
int temp = ( rand()% ( MAX_PICK - MIN_PICK + 1 ) + MIN_PICK );
temp += clock;
return temp;
}
void update_fin_stat(stat& s, const cust& c, const int& clock)
{
//initialize variables for shop, wait, and service time
int shop = 0;
int wait = 0;
int serv = 0;
//calculate shop time, wait time, and service time
//calculate shop time
shop = c.s_checkout - c.atime; //checkout time - arrival time
//calculate wait time
wait = c.wtime;
//calculate serv time
serv = dept_time(clock) - c.wtime;
//update values in struct s
s.num_dept++;
s.tot_shop += shop;
s.tot_wait += wait;
s.tot_serv += serv;
//if number departed is multiple of sample int
if(s.num_dept % SAMPLE_INT == 0)
{
cout << "num = " << s.num_dept << " ";
cout << "id = " << c.id << " ";
cout << "shop = " << shop << " ";
cout << "wait = " << wait << " ";
cout << "serv = " << serv << " ";
cout << endl;
}
}
bool cmp (const cust& c1, const cust& c2)
{
return c1.s_checkout < c2.s_checkout;
}
void print_fin_stat(stat& s)
{
//print final stats
cout << "Number of Customers" << s.num_dept << endl;
cout << "Total Sim Time " << SIM_TIME << endl;
//compute averages
s.avg_shop = s.tot_shop / s.num_dept;
s.avg_wait = s.tot_wait / s.num_dept;
s.avg_serv = s.tot_serv / s.num_dept;
//print averages
cout << "Average Shop Time" << s.avg_shop << endl;
cout << "Average Wait Time" << s.avg_wait << endl;
cout << "Average Serv Time" << s.avg_serv << endl;
}
答案 0 :(得分:0)
当指向null,未分配的内存或只读内存的指针,引用或迭代器被取消引用时,通常会发生分段错误。最有可能的是,您的list<cust>::iterator i
在未初始化的情况下被解除引用。
使用-g选项进行编译并在调试器中运行程序(例如gdb progname
)可以获得代码中出现无效解除引用的行。然后,您必须查看先前的执行,以找到迭代器应设置为指向有效内存的位置。