Войти
ПрограммированиеФорумОбщее

MVSC assretion failed in std::map

Страницы: 1 2 3 4 Следующая »
#0
2:01, 11 дек. 2011

Компилированно в QtCreator с компилятором от 2007 студии.
Интересно то что в дебаге выдает assertion failed , invalid operator<, но в релизе работает.
Если закоментить сравнение строк то ассерта нет.
Кто может сказать в чем проблема с кодом.

#include <QtCore/QCoreApplication>
#include <map>
#include <QDebug>
#include <QString>


class Mode_Signature
{
public:

    Mode_Signature()
    {
    }

    Mode_Signature(char _type, int _m, int _n): m_modetype(_type), m_m_number(_m), m_n_number(_n)
    {
    }

    ~Mode_Signature()
    {
    }

  QString       m_modetype;
  int           m_m_number;
  int           m_n_number;

  bool operator<(const Mode_Signature& _ms2) const
  {
      if(m_modetype < _ms2.m_modetype) return true;
      if(m_m_number < _ms2.m_m_number) return true;
      if(m_n_number < _ms2.m_n_number) return true;
      return false;
  }
};


std::map<Mode_Signature, double> m_modeMap;

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

    Mode_Signature mode1;
    mode1.m_modetype = 'T';
    mode1.m_m_number = 10;
    mode1.m_n_number = 1;

    Mode_Signature mode2;
    mode2.m_modetype = 'T';
    mode2.m_m_number = 20;
    mode2.m_n_number = 2;

    Mode_Signature mode3;
    mode3.m_modetype = 'M';
    mode3.m_m_number = 10;
    mode3.m_n_number = 1;

    Mode_Signature mode4;
    mode4.m_modetype = 'M';
    mode4.m_m_number = 20;
    mode4.m_n_number = 2;

    m_modeMap[mode1] = 1.0;
    m_modeMap[mode2] = 2.0;
    m_modeMap[mode3] = 3.0;
    m_modeMap[mode4] = 4.0;

    qDebug() << "In routine";

    qDebug() << m_modeMap[Mode_Signature('T', 10, 1)];

    return a.exec();
}

#1
2:16, 11 дек. 2011

http://www.sgi.com/tech/stl/StrictWeakOrdering.html

для пары
T 10 1
M 20 2
у тебя получается что !(T < M & 10 < 20) это true, и (M < T ) это true

#2
2:20, 11 дек. 2011

Я тут вижу проблемы с копированием строчек. Не думаю, что можно QString так копировать.

upd
Сравнение неправильное. И у ламера тоже неправильное.

#3
2:25, 11 дек. 2011
 bool operator<(const Mode_Signature& _ms2) const
  { 
     return(m_modetype < _ms2.m_modetype)&&(m_m_number < _ms2.m_m_number)&&(m_n_number < _ms2.m_n_number);
  }
#4
2:32, 11 дек. 2011

laMer007
dave будет удивлен когда увидит у себя в map один элемент ;)

#5
2:35, 11 дек. 2011

Chipmunk
> Я тут вижу проблемы с копированием строчек. Не думаю, что можно QString так
> копировать.

Это упрощенный вариант, я уже попробовал простой char.
В первой версии я использовал конструкторы QString везде, но и этот вариант работает.

Иннокентий
Я натыкался на этот strict weak ordering  пока искал проблему.
Но так и не понял как мой оператор в нее не вписывается и почему именно сравнение строк вызывает в нем такое беспокойство. Потом попробую gcc, интересно что он "скажет".

#6
2:37, 11 дек. 2011

dave
> Но так и не понял как мой оператор в нее не вписывается и почему именно
> сравнение строк вызывает в нем такое беспокойство. Потом попробую gcc,
> интересно что он "скажет".
я там поправил свой коммент с примером для твоих данных.

#7
2:38, 11 дек. 2011

laMer007
> bool operator<(const Mode_Signature& _ms2) const
> {
> return(m_modetype < _ms2.m_modetype)&&(m_m_number <
> _ms2.m_m_number)&&(m_n_number < _ms2.m_n_number);
> }

Этот вариант вообще не работает.
Я его с самого начало пробовал.
И потом его поведение не совсем предсказуемо.

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

#8
2:55, 11 дек. 2011

Вот правильное сравнение, конец страданиям:

      if(m_modetype < _ms2.m_modetype) return true;
      else if (_ms2.m_modetype < m_modetype)
         if(m_m_number < _ms2.m_m_number) return true;
         else if (_ms2.m_m_number < m_m_number)
            if(m_n_number < _ms2.m_n_number) return true;
            else if (_ms2.m_n_number < m_n_number)
               return false;

      return true;

#9
2:57, 11 дек. 2011

Chipmunk
опять же, для пары T 10 1, T 20 2 будет ассерт

#10
2:58, 11 дек. 2011

Иннокентий
> dave будет удивлен когда увидит у себя в map один элемент ;)
Oh shi~
Что я написал... Зря я сидел до 4 часов ночи...

#11
3:01, 11 дек. 2011

  bool operator<(const Mode_Signature& _ms2) const
  {
      if(m_modetype >= _ms2.m_modetype) return false;
      if(m_m_number >= _ms2.m_m_number) return false;
      if(m_n_number >= _ms2.m_n_number) return false;
      return true;
  }

? =)

#12
3:02, 11 дек. 2011

Blew_zc
нет. это будет тоже самое что и у laMer007

#13
3:08, 11 дек. 2011

Иннокентий
> опять же, для пары T 10 1, T 20 2 будет ассерт
Да, действительно.

      if(m_modetype < _ms2.m_modetype) return true;
      else if (_ms2.m_modetype < m_modetype)
      {
         if(m_m_number < _ms2.m_m_number) return true;
         else if (_ms2.m_m_number < m_m_number)
         {
            if(m_n_number < _ms2.m_n_number) return true;
            else return !(_ms2.m_n_number < m_n_number)
         } else return false;
      } else return false;
#14
3:08, 11 дек. 2011

dave
> if(_ms1.m_modetype < _ms2.m_modetype) return true;
> if(_ms2.m_m_number < _ms2.m_m_number) return true;
> if(_ms2.m_n_number < _ms2.m_n_number) return true;
очепятка?

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.