Переопределение, Основные типы - PullRequest
0 голосов
/ 06 октября 2011

Я работал над заданием на имитацию продуктового магазина и считаю, что оно относительно закончено, но при компиляции у меня возникает ошибка сегментацииЕсли бы вы могли предоставить какое-то направление или решение, я был бы очень признателен.Спасибо, Тейлор

/*********************************************
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;
}

1 Ответ

0 голосов
/ 06 октября 2011

Ошибки сегментации обычно возникают, когда разыменовывается указатель, ссылка или итератор, указывающий на нулевую, нераспределенную память или только для чтения.Скорее всего, ваш list<cust>::iterator i разыменовывается без инициализации.

Компиляция с параметром -g и запуск программы в отладчике (например, gdb progname) должны получить строку кода, в которойпроисходит неверное разыменование.Затем вы должны обратиться к более раннему выполнению, чтобы найти, где итератор должен быть установлен так, чтобы он указывал на действительную память.

...