2010-09-21 7 views
0

Mon programme consiste à imprimer la file d'attente d'informations à partir d'un fichier mais j'ai un problème avec mon code suivant. Quand je lance le programme, je garde la boucle. Je ne peux pas comprendre le problème. De l'aide?Problème de simulation de file d'attente

#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

À l'avenir, s'il vous plaît sélectionnez votre code dans l'éditeur et cliquez sur le bouton '101010' pour le mettre en forme correctement. –

+0

okay. Pardon! sera éveillé pour cela. – keitamike

Répondre

3

Votre processArrival et processDeparture fonctions prennent leurs eventList et printQueue arguments par valeur. Cela signifie que lorsque vous les appelez, par exemple dans cette ligne:

processArrival(newEvent, inFile, eventList, printQueue); 

copies de eventList et printQueue sont faits et passés dans la fonction processArrival. La fonction processArrival fonctionne alors sur ces copies et les données d'origine ne sont jamais modifiées. En particulier, cela signifie que le eventList original ne verra jamais aucun élément supprimé, donc il ne sera jamais vide - il continuera à essayer de traiter le premier événement encore et encore. La solution consiste à passer ces paramètres par la référence. dire modifier la définition de processArrival à

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

Notez les & caractères que je l'ai inséré avant eventList et printQueue. Ces causes références aux données d'origine, plutôt que des copies des données d'origine, à transmettre à la fonction processArival. Cela signifie que processArrival fonctionnera directement sur les données d'origine comme vous le souhaitez. N'oubliez pas d'apporter la modification correspondante à processDeparture également.

+0

merci! j'ai compris! – keitamike