2014-12-07 2 views
0

Я работаю над программой моделирования больниц, где пациенты сортируются по уровню серьезности и помещаются в соответствующие очереди. Кажется, что все работает нормально, когда я отлаживаю его, но по какой-то причине он останавливается после случайного количества циклов. Я не получаю никаких ошибок - моя программа просто закрывает средний цикл. Что могло случиться?C++ Программа останавливает средний цикл без ошибок

priority_queue<Hospital_Visit> queue1, queue2; 
vector<int> nurse_time_vector, doctor_time_vector; 
vector<Hospital_Visit> current_hospital_visit; 

for (int i = 0; i < master_hospital_visit.size(); i++){ //make a copy of the master_hospital_visit to manipulate 
    current_hospital_visit.push_back(master_hospital_visit[i]); 
} 



if (num_nurses>0) 
    nurse->set_minute(0); 
if (num_doctors>0) 
    doctor->set_minute(0); 

int treatment; 

map<string, vector<Hospital_Visit>>::iterator it; 

srand(time(NULL)); 

bool hour_changed = true; 

do{ 

    if (hour_changed){ //update queues with new hour's patients added to end 
     for (int i = 0; i < current_hospital_visit.size(); i++){ 
      if (current_hospital_visit[i].get_hour() > current_hour){ 
       break; 
      } 
      if (current_hospital_visit[i].get_hour() <= current_hour) 
      { 
       if (current_hospital_visit[i].get_severity() <= 10) // For nurses 
       { 
        queue1.push(current_hospital_visit[i]); 
        current_hospital_visit.erase(current_hospital_visit.begin() + i); 
       } 
       else // for doctors 
       { 
        queue2.push(current_hospital_visit[i]); 
        current_hospital_visit.erase(current_hospital_visit.begin() + i); 
       } 
      } 
     } 
    } 

    hour_changed = false; 


     if (nurse->get_minute() != nurse->get_max_time() && queue1.size() != 0 && queue1.top().get_hour() <= current_hour && num_nurses > 0) 
     { 
      treatment = (rand() % 11) + 1; 

      queue1.top().set_treatment_time(treatment); 

      queue1.top().set_day(current_hour/24); 

      queue1.top().set_hour(current_hour); 

      nurse->set_minute(treatment); 

      queue1.top().set_wait_time(current_hour - queue1.top().get_hour() + treatment); 

      queue1.top().set_medic(false); 


      queue1.top().set_severity(queue1.top().get_severity() - (current_hour - queue1.top().get_hour())); 


      it = patients_map.find(queue1.top().get_name()); 
      if (it == patients_map.end()) 
      { 
       vector<Hospital_Visit> patient_visits; 

       patient_visits.push_back(queue1.top()); 

       patients_map.insert(make_pair(queue1.top().get_name(), patient_visits)); 
      } 
      else 
      { 
       it->second.push_back(queue1.top()); 
      } 
      queue1.pop(); 
     } 
     else if (queue1.size() == 0 && num_nurses > 0) //was != 
     { 
      nurse_time_vector.push_back(nurse->get_max_time() - nurse->get_medic_hour()); 
     } 

     if (doctor->get_medic_hour() != doctor->get_max_time() && queue2.size() != 0 && 
      queue2.top().get_hour() <= current_hour && num_doctors > 0) 
     { 
      treatment = (rand() % 21) + 1; 

      queue2.top().set_treatment_time(treatment); 

      queue2.top().set_day(current_hour/24); 

      queue2.top().set_hour(current_hour); 

      doctor->set_minute(treatment); 

      queue2.top().set_wait_time(current_hour - queue2.top().get_hour() + treatment); 

      queue2.top().set_medic(true); 

      queue2.top().set_severity(queue2.top().get_severity() - (current_hour - queue2.top().get_hour())); 

      it = patients_map.find(queue2.top().get_name()); 
      if (it == patients_map.end()) 
      { 

       vector<Hospital_Visit> patient_visits; 

       patient_visits.push_back(queue2.top()); 

       patients_map.insert(make_pair(queue2.top().get_name(), patient_visits)); 
      } 
      else 
      { 

       it->second.push_back(queue2.top()); 
      } 
      queue2.pop(); 
     } 

     else if (doctor->get_minute() != doctor->get_max_time() && queue1.size() != 0 && queue2.size() == 0 
      && queue1.top().get_hour() <= current_hour && num_doctors > 0){ 

      treatment = (rand() % 21) + 1; 

      queue1.top().set_treatment_time(treatment); 

      queue1.top().set_day(current_hour/24); 

      queue1.top().set_hour(current_hour); 

      doctor->set_minute(treatment); 

      queue1.top().set_wait_time(current_hour - queue1.top().get_hour() + treatment); 

      queue1.top().set_medic(true); 

      queue1.top().set_severity(queue1.top().get_severity() - (current_hour - queue1.top().get_hour())); 

      it = patients_map.find(queue1.top().get_name()); 
      if (it == patients_map.end()) 
      { 
       vector<Hospital_Visit> patient_visits; 
       patient_visits.push_back(queue1.top()); 
       patients_map.insert(make_pair(queue1.top().get_name(), patient_visits)); 
      } 
      else 
      { 
       it->second.push_back(queue1.top()); 
      } 
      queue1.pop(); 

     } 

     if ((doctor->get_minute() <= doctor->get_max_time() + 20 && doctor->get_minute() >= doctor->get_max_time()-5) 
      || (queue1.size() == 0 && queue2.size() == 0)) 
      { // if the max time is reached or the queues are empty, then change the hour 

      current_hour++; 
      hour_changed = true; 

      if (num_nurses>0) 
       nurse->set_minute(0); 
      if (num_doctors>0) 
       doctor->set_minute(0); 

      } 

} while (current_hour != 169); 
+2

Это идеальное положение для обучения, как использовать отладчик. – Silicomancer

+0

Я отлаживал его последние 3 часа. это не дает мне никаких ошибок, и он даже не говорит о выходе программы. он просто уходит - т. е. отладчик останавливается. – tdon

+2

Если вы хотите воспроизводимости, залейте свой PRNG с постоянным значением или не засевайте вообще. Затем запустите в отладчике. Если простой запуск не показывает вам, где ошибка, проследите за выполнением шаг за шагом, чтобы найти линию нарушения. Ваш вопрос в его нынешнем виде является неопровержимым: слишком много кода, чтобы обнаружить ошибку путем глазного яблока, но недостаточно, чтобы воспроизвести ее. –

ответ

1

Посмотрите на эту петлю:

for (int i = 0; i < current_hospital_visit.size(); i++){ 
    ... 
    if (...) 
    { 
     current_hospital_visit.erase(current_hospital_visit.begin() + i); 
    } 
    ... 
} 

не будет проверять каждый элемент. Предположим, что i - 3, а условие if истинно. Элемент 3 стирается, делая элемент 4 новый элемент 3. Но в следующей итерации i увеличивается и становится 4, поэтому этот новый элемент 3 никогда не будет проверен.

Возможное решение для уменьшения i когда вы сотрете:

for (int i = 0; i < current_hospital_visit.size(); i++){ 
    ... 
    if (...) 
    { 
     current_hospital_visit.erase(current_hospital_visit.begin() + i); 
     i--; 
    } 
    ... 
} 
+0

Мое намерение состояло в том, чтобы сделать вектор визитов в больницу, затем выполнить поиск по этому вектору для предметов, равных или ниже «текущего часа», затем добавить их в очередь лечения и удалить их из вектора, чтобы не дублировать в следующий раз он увеличивает час. Разве эта логика имеет смысл или я должен попробовать что-то другое? – tdon

+0

Да, это имеет смысл, это просто, что не все элементы, равные или текущие, будут перемещены текущим кодом. Например, вы можете писать 'i -' каждый раз, когда вы перемещаете элемент. – alain

+0

Я обновил свой ответ. – alain