Я работаю над программой моделирования больниц, где пациенты сортируются по уровню серьезности и помещаются в соответствующие очереди. Кажется, что все работает нормально, когда я отлаживаю его, но по какой-то причине он останавливается после случайного количества циклов. Я не получаю никаких ошибок - моя программа просто закрывает средний цикл. Что могло случиться?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);
Это идеальное положение для обучения, как использовать отладчик. – Silicomancer
Я отлаживал его последние 3 часа. это не дает мне никаких ошибок, и он даже не говорит о выходе программы. он просто уходит - т. е. отладчик останавливается. – tdon
Если вы хотите воспроизводимости, залейте свой PRNG с постоянным значением или не засевайте вообще. Затем запустите в отладчике. Если простой запуск не показывает вам, где ошибка, проследите за выполнением шаг за шагом, чтобы найти линию нарушения. Ваш вопрос в его нынешнем виде является неопровержимым: слишком много кода, чтобы обнаружить ошибку путем глазного яблока, но недостаточно, чтобы воспроизвести ее. –