Я сталкиваюсь с этой странной проблемой, которая оставила меня без понятия, и я не могу выяснить проблему.Ниже приводится постановка задачи.
В соревнованиях участвуют 100 команд (пронумерованных от 1 до 100), которые пытаются решить 9 задач.Команда может быть не в состоянии решить какую-либо проблему, в этом случае total_solved
проблемы и total_time
будут равны нулю.Ради простоты я поддерживаю статический вектор размером 100. name
хранит номер команды (от 1 до 100).Я использую флаг active
, чтобы узнать, что команда представила хотя бы 1 решение (даже неправильное).
Вот класс team
:
class team
{
public:
int total_solved;
int time[9];
int total_time;
bool solved[9];
bool active;
int name;
team()
{
total_solved = total_time = 0;
active = false;
name = -1;
for(int i=0;i<9;i++)
{
solved[i] = false;
time[i] = 0;
}
}
};
Вот вектор:
for(int i=0;i<100;i++)
{
record.push_back(new team());
}
Где-то позже я заполняю данные о командах.Вот дамп данных, соответствующих этим командам:
cout << "Dumping the data\n";
for(auto it=record.begin();it!=record.end();it++)
{
cout << (*it)->name << " " << (*it)->total_solved << " " << (*it)->total_time << " " << ((*it)->active?'Y':'N') << endl;
}
cout << "That's all\n";
Dumping the data
-1 0 0 N
2 0 0 Y
-1 0 0 N
-1 0 0 N
5 0 0 Y
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
24 0 0 Y
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
34 0 0 Y
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
41 0 0 Y
-1 0 0 N
-1 0 0 N
-1 0 0 N
45 0 0 Y
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
58 0 0 Y
-1 0 0 N
-1 0 0 N
-1 0 0 N
62 0 0 Y
-1 0 0 N
64 0 0 Y
-1 0 0 N
-1 0 0 N
67 0 0 Y
-1 0 0 N
69 0 0 Y
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
78 0 0 Y
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
-1 0 0 N
That's all
Вы можете видеть, что ни одна команда не решила ни одной проблемы в данном конкретном случае.И некоторые команды не активны (не представили никакого решения, name
как -1 или active
как false означает, что).Сбой происходит, когда я пытаюсь отсортировать эти 100 командных данных.Критерии сортировки таковы, что команды должны решать максимум задач за минимальное время.Если есть связь, мы будем сортировать по номеру команды, игнорируя неактивные.
bool compare(team *t1, team *t2)
{
if(t1->total_solved != t2->total_solved)
return t1->total_solved > t2->total_solved;
if(t1->total_time != t2->total_time)
return t1->total_time < t2->total_time;
return t1->active;
}
sort(record.begin(),record.end(),compare);
Я проанализировал через GDB, я получаю следующее:
Program received signal SIGSEGV, Segmentation fault.
0x00005555555552d0 in compare (t1=0x55555576fec0, t2=0x411) at 10258.cpp:33
33 if(t1->total_solved != t2->total_solved)
t2
isопределенно получаю неверный указатель, но мне интересно, почему?
EDIT
Вот скомпилированная версия: https://ideone.com/bcnmE0 с вводом образца.