2015-07-16 9 views
-1

В моем коде, у меня есть большое количество проверок на равенство ...qreal равенства терпит неудачу в освобождении, но работает в отладке (и бросьте плавать также работает)

, например:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 


    QGraphicsLineItem* x = new QGraphicsLineItem(50, 50, -50, -50); 
    QGraphicsView view(new QGraphicsScene(-200, -150, 400, 300)); 
    view.scene()->addItem(x); 
    view.show(); 

    bool sameLine = true; 
    QLineF line1 = x->line(); 
    qreal _length = line1.length(); 

    foreach(QGraphicsItem* item, view.scene()->selectedItems()) 
    { 
     QGraphicsLineItem *item2 = dynamic_cast<QGraphicsLineItem*>(item); 
     if(item2->line().length() != _length) 
      sameLine = false; 
    } 
    qDebug("same line: %d", sameLine); 
} 

Кажется, что работает ... в отладке. Затем, когда тестируется в выпуске, он терпит неудачу?

Предположим, один выбранный элемент, так item1 и item2 одинаковы, поэтому независимо от точности, указанные выше длины должны быть равны ....

В отлаживать, я не был в состоянии видеть это провал. .. еще в релизе, он всегда терпит неудачу!

функции выше (length()) Возвращает qreal

Единственные обходные я вижу бы
- реализовать мои собственные проверки на равенство, что ограничивает точность, или
- отбрасывать любые qreal значения до float.
Но это нелогично (и много работы, мне нужно было бы проверить количество потенциальных мест).

Может кто-нибудь объяснить, почему это происходит и как лучше всего обойти эту проблему?

+0

Вы явно не скомпилировали этот код, так как он сказал бы вам, что вы попытались получить доступ к элементу указателя. Поэтому я могу заключить, что вы не опубликовали фактический код, с которым у вас возникла проблема, что делает ваш вопрос совершенно бесполезным и полностью безответным. Пожалуйста, вернитесь, когда у вас есть реальный вопрос. – Puppy

+0

@Puppy исправлена, я скопировал это из очень большой программы с очень большим количеством проверок, так что действительно, это не полный код. Я скопировал и вставил соответствующую часть. – Thalia

+0

Можете ли вы предоставить [MCVE] (https://stackoverflow.com/help/mcve), который демонстрирует эту проблему? Трудно диагностировать, что может происходить без полного контекста. –

ответ

2

Вы должны сравнить значения с плавающей запятой, например, qFuzzyCompare, если вы уже используете Qt. Вы не должны сравнивать две переменные с плавающей запятой, просто используя ==.

+0

Спасибо, это, вероятно, то, что мне нужно ... но я никогда не понимал, насколько плохое сравнение с плавающей запятой было ... У меня много сравнений для других типов, таких как QPointF и даже QLineF - Могу ли я надеяться, что внутренняя проверка равенства будет реализована одинаково? – Thalia

+0

Надеюсь, что [документация] (http://doc.qt.io/qt-4.8/qlinef.html#operator-eq-eq) не сообщит нам подробности на этой глубине. –

+0

Я искал, и я обнаружил, что 'QPointF' использует для этого функцию' qFuzzyIsNull'. Вы можете проверить его в файле заголовка 'QPoint'. –