2010-09-21 53 views
0

我的程序是打印来自文件的信息队列,但我有我的下面的代码的问题。当我运行程序时,它保持循环。我不知道这个问题。任何帮助?队列模拟问题

#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++; 
    } 

} 
+0

未来,请在编辑器中选择您的代码,然后点击'101010'按钮,给它正确的格式。 – 2010-09-21 18:09:20

+0

好的。抱歉!将会为此感到惊讶。 – keitamike 2010-09-21 18:16:04

回答

3

processArrivalprocessDeparture功能由价值考虑其eventListprintQueue参数。这意味着,当你在这一行打电话给他们,例如:

processArrival(newEvent, inFile, eventList, printQueue); 

副本的eventListprintQueue制成,并传递到processArrival功能。然后processArrival函数对这些副本进行操作,并且原始数据永远不会被修改。特别是,这意味着原始eventList将永远不会有任何项目从中删除,所以它永远不会是空的 - 它将一直试图一次又一次地处理第一个事件。

解决方案是通过参考传递这些参数。即processArrival的定义修改为

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

注意,我eventListprintQueue前插入&字符。这些引起引用到原始数据,而不是原始数据的副本,将被传递到processArival函数。这意味着processArrival将按照您的意愿直接对原始数据进行操作。不要忘记相应地更改为processDeparture

+0

谢谢!我懂了! – keitamike 2010-09-21 18:19:41