Проблема имитации очереди - PullRequest
0 голосов
/ 21 сентября 2010

Моя программа для печати очереди информации из файла, но у меня проблема с моим следующим кодом.Когда я запускаю программу, она остается в курсе.Я не могу понять проблему.Любая помощь?

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <queue>
#include <list>
using namespace std;

void simulation(ifstream &infile);
void processArrival(int *newEvent, ifstream &inFile, list<int> eventList,queue<int> printQueue);
void processDeparture(int *newEvent, list<int> eventList,queue<int> printQueue);
    string name[100];
    int timeAccepted[100];
    int fileSize[100];
    int i = 1;
    int j = 1;

int currentTime;
bool checker = true;
int main(void)
{

    ifstream inFile;
    string fileName;

    int i = 0;
    inFile.open("123.txt", ios::in);

    simulation(inFile);
    /*while(inFile.peek() != EOF )

    {
        inFile>>name[i]>>timeAccepted[i]>>fileSize[i];
        i++;
    }

    for(int s = 0; s < i; s++)
    {
        cout << name[s] << timeAccepted[s] <<  fileSize[s] <<endl;
    }*/
    return 0;
}


void simulation(ifstream &inFile)
{
    queue<int> printQueue;
    list<int> eventList;

    int *newEvent;
    while(inFile.peek() != '\n')
    {
        inFile>>name[0]>>timeAccepted[0]>>fileSize[0];



    }



    eventList.push_front(timeAccepted[0]);
    int checkEmpty = eventList.empty();
    newEvent = &eventList.front();
    while(checkEmpty ==0)
    {

         newEvent = &eventList.front();


        if(checker)
        {
            processArrival(newEvent, inFile, eventList, printQueue);

        }

        else
        {
            processDeparture(newEvent, eventList, printQueue);

        }
        checkEmpty = eventList.empty();
    }


}

void processArrival(int *newEvent, ifstream &inFile, list<int> eventList,queue<int> printQueue)
{
    int atFront=0;
    atFront = printQueue.empty();
    cout << atFront <<endl;
    printQueue.push(*newEvent);
    cout << printQueue.front() <<endl;
    eventList.remove(*newEvent);

    int temp;

    if(atFront==1)
    {
        currentTime = *newEvent + fileSize[0];
        cout << name[0] << " @@ " << *newEvent << " @@ " << currentTime << endl;
        eventList.push_back(currentTime);



    }
    checker = false;
    if(inFile.peek() != EOF )
    {

        inFile>>name[i]>>timeAccepted[i]>>fileSize[i];

        eventList.push_back( timeAccepted[i] );
        i++;

        checker = false;
        if(eventList.back() <= eventList.front())
        {
            temp = eventList.back();
            eventList.back() = eventList.front();
            eventList.front() = temp;
            checker = true;
        }
    }





}

void processDeparture(int *newEvent, list<int> eventList,queue<int> printQueue)
{
    printQueue.pop();
    eventList.pop_front();
    int checkEmpty = 1;
    checkEmpty = printQueue.empty();
    int temp;
    if(checkEmpty ==0)
    {
        currentTime = *newEvent + fileSize[j];
        cout << name[j] << " " << *newEvent << " " << currentTime << endl;
        eventList.push_back(currentTime);
        checker = true;
        if(eventList.back() < eventList.front())
        {
            temp = eventList.back();
            eventList.back() = eventList.front();
            eventList.front() = temp;
            checker = false;
        }
        j++;
    }

}

1 Ответ

3 голосов
/ 21 сентября 2010

Ваши функции processArrival и processDeparture принимают свои аргументы eventList и printQueue по значению.Это означает, что когда вы вызываете их, например, в этой строке:

processArrival(newEvent, inFile, eventList, printQueue);

Копии из eventList и printQueue создаются и передаются в функцию processArrival.Затем функция processArrival работает с этими копиями, и исходные данные никогда не изменяются.В частности, это означает, что в исходном eventList никогда не будут удалены какие-либо элементы, поэтому он никогда не будет пустым - он будет просто пытаться обрабатывать первое событие снова и снова.

Решение - передать эти параметры по ссылке .т.е. измените определение processArrival на

void processArrival(int *newEvent, ifstream &inFile, list<int>& eventList, queue<int>& printQueue)

Обратите внимание на символы &, которые я вставил до eventList и printQueue.Это приводит к тому, что ссылается на исходные данные, а не на копии исходных данных, которые передаются в функцию processArival.Это означает, что processArrival будет работать непосредственно с исходными данными так, как вы намереваетесь.Не забудьте также внести соответствующие изменения в processDeparture.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...