2010-09-21 114 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