Выражение: Недопустимый оператор ‹ - Не удается найти ошибку

if(!projectiles.empty()){
        sort(projectiles.rbegin(), projectiles.rend()); //Occasionally I get bad sort error. No idea why.
    }

снаряды — это std::vector, полный структур снарядов. Они добавляются каждый кадр, если выполняется команда «огонь», и автоматически удаляются каждый кадр, если истекает время ожидания.

В снаряде:

bool operator < (const projectile& proj) const
{
    return (D3DXVec3Dot(&pos, p_camera.GetWorldAhead()) < D3DXVec3Dot(&proj.pos, p_camera.GetWorldAhead()));
}

... pos - это D3DXVECTOR3 с позицией снаряда в трехмерном пространстве - это работает (сортировка предназначена для проверки глубины при альфа-смешении). Для тех, кому интересно, D3DXVec3Dot возвращает число с плавающей запятой. Но изредка, особенно при большом количестве снарядов на экране, выкидывает:

Ошибка утверждения отладки!

Программа: C:\Windows\system32\MSVCP110D.dll Файл: e:\applications\vc\include\algorithm Строка: 3566

Выражение: неверный оператор‹

Сведения о том, как ваша программа может привести к ошибке утверждения, см. в документации Visual C++ по утверждениям.

Не уверен, почему. Любая помощь горячо приветствуется.


person J.Swersey    schedule 04.07.2013    source источник
comment
Есть ли резьба..?   -  person Paul    schedule 05.07.2013
comment
Хм... повторяющиеся звонки D3DXVec3Dot и p_camera.GetWorldAhead() кажутся созревшими для проблем. Пол прав, когда спрашивает о многопоточности. Похоже, вы хотите вычислить эти значения один раз и как-то отсортировать по прокси. (В Perl это называется преобразованием Шварца.)   -  person Joe Z    schedule 05.07.2013
comment
@Paul: понятия не имею... :/   -  person J.Swersey    schedule 05.07.2013
comment
@Joe: проблема в том, что значения обновляются в каждом кадре.   -  person J.Swersey    schedule 05.07.2013


Ответы (3)


Я знаю, что это неправильный ответ, но он стал слишком длинным для комментария.

Сообщение об ошибке указывает на то, что сравнение не является согласованным — функция sort ожидает, что одни и те же значения будут каждый раз сортироваться одним и тем же способом. Если он обнаружит, что два сравнения одного и того же значения дают противоположные результаты, он выдаст эту ошибку. Подозреваю, что либо ваши сравнения неверны, либо внутренние расчеты дают разные результаты в разное время (например, снаряды перемещаются).

Учитывая, что вы получаете его только иногда, это указывает либо на состояние гонки, либо на небольшую ошибку расчета, которая приводит к нестабильным результатам.

И убедитесь, что во время сортировки камера или снаряды не двигаются — если один или оба двигаются во время сортировки, вы никогда не сможете решить эту проблему.

person Mats Petersson    schedule 04.07.2013
comment
Хорошо, это может объяснить это. Проблема в первую очередь в том, что это в значительной степени построено на шаблонном проекте, предоставленном курсом, и я не знаю, как вообще работает поток в нем. Я знаю, что в каждом кадре, в другой части программного кода, и камера, и снаряды будут двигаться. Думаю, я спрошу репетитора позже на этой неделе. :/ - person J.Swersey; 05.07.2013

Я решил проблему, сохранив расстояние для каждой структуры в своей собственной переменной один раз в начале кадра, а затем сравнив их - таким образом, нет никаких шансов, что условия гонки появятся. Спасибо за советы ребята. :)

person J.Swersey    schedule 08.07.2013

Вы также можете добавить простую проверку, если ваш вектор уже отсортирован перед вызовом sort. Мне помогло в моем случае.

person l0pan    schedule 12.03.2014