crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

6 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> QList <internal error>, помогите
kemiisto
  опции профиля:
сообщение 5.9.2009, 16:34
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 5.9.2009
Из: Осло, Норвегия
Пользователь №: 1054

Спасибо сказали: 2 раз(а)




Репутация:   0  


Здравствуйте!

Если у кого-нибудь найдётся минутка-другая, посмотрите проектик. Исходники тут. Я не стал убирать *.dll и *.a от QGLViewer'а и инклюды от QGLViewer'а и Eigen'а. Так чтоб под Windows собиралось "из коробки"...

Я первый раз пишу на ++ и проект только-только начинается. Так что там много методов-пустышек и "говнокода". :blush:

Собственно, беда такая. Есть у нас класс (молекула)
namespace Chemistry
{
  class Molecule
  {
  public:
  ...

  private:
    typedef QList<Chemistry::Bond*> IncidenceList;
    typedef QList<IncidenceList> IncidenceMatrix;

    IncidenceMatrix incidenceMatrix_;
    QList<Chemistry::Bond*> chemistryBonds_;
    QList<Chemistry::Atom*> chemistryAtoms_;    
    ...
  };
}


В Render::Viewer попытка использовать экземпляр этого класса
namespace Render
{
  class Viewer : public QGLViewer
  {
    Q_OBJECT

  public:
  ...

  protected:
  ...

  private:
    Chemistry::Molecule chemistryMolecule_;
    ...

  };
}


Попытка не совсем успешная. Когда отрабатывает конструктор Chemistry::Molecule, все 3 списка инициализируются.



При попытке добавить атом в Render::Viewer::mousePressEvent в самом начале ставим точку останова:



Вот. Куда то пропал incidenceMatrix_. Куда?

А самое интересное. Если в объявлении поменять местами скажем так:
  private:
    typedef QList<Chemistry::Bond*> IncidenceList;
    typedef QList<IncidenceList> IncidenceMatrix;

    QList<Chemistry::Bond*> chemistryBonds_;
    QList<Chemistry::Atom*> chemistryAtoms_;
    IncidenceMatrix incidenceMatrix_;


то на точке останова не будет уже chemistryBonds_.

То есть получается: кто первым объявлен (первым инициализируется в конструкторе), тот куда-то пропадает.

Немного побегал дебагом. Список портится внутри void Render::Viewer::updateMolecule().

До вызова updateGL() всё отлично, после <internal error>. А это метод (точнее слот) QGLViewer'а.

Мыслей больше нет. :blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.9.2009, 17:34
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


В отладчике не смотрел, воткнул qDebug в Chemistry::Molecule::Molecule(const Chemistry::Molecule& chemistryMolecule)
Chemistry::Molecule::Molecule(const Chemistry::Molecule& chemistryMolecule)
{
  chemistryAtoms_ = QList<Chemistry::Atom*>(chemistryMolecule.chemistryAtoms_);
  chemistryBonds_ = QList<Chemistry::Bond*>(chemistryMolecule.chemistryBonds_);
  incidenceMatrix_ = IncidenceMatrix(chemistryMolecule.incidenceMatrix_);
  charge_ = chemistryMolecule.charge_;
  
  qDebug() << "chemistryAtoms_" << chemistryAtoms_;
  qDebug() << "chemistryBonds_" << chemistryBonds_;
  qDebug() << "incidenceMatrix_" << incidenceMatrix_;
  qDebug() << "charge_" << charge_;
}
запустил программу, открыл пример H2O, в консоль напечаталось:
Цитата
Internal debug: initializeGL() is called in QGLViewer constructor.
chemistryAtoms_ (0x54659f8, 0x62d1f00, 0x62dafa0, 0x62cf9d8, 0x6315cb0, 0x62cfd6
8, 0x62d1ac8, 0x62cefe0, 0x62c1298, 0x62ce8c0, 0x6305a58, 0x62cf610, 0x62d07f0,
0x62d1cf0, 0x62d2668, 0x62d2010, 0x62d2480, 0x62d4f48, 0x62d1918, 0x62d1450, 0x6
2cfb88, 0x62cff78, 0x62d04f8, 0x62d06e0)
chemistryBonds_ (0x62ca5b8, 0x6315ec8, 0x62cc1d8, 0x62ce218, 0x62d0f80, 0x631f36
0, 0x62b6f88, 0x62b6db8, 0x6315258, 0x546a2c0, 0x546b2d8, 0x63159a8, 0x63152b8,
0x54659e0, 0x631f9d0, 0x62fffc8, 0x546aca8, 0x631f950, 0x631f990, 0x631f9e8, 0x6
31f5d0, 0x631fa78, 0x62b2ee8, 0x62b90c8, 0x631f540)
incidenceMatrix_ ((0x62ca5b8, 0x6315ec8, 0x62cc1d8) , (0x62ce218, 0x62d0f80) ,
(0x631f360, 0x62b6f88, 0x62b6db8) , (0x6315258, 0x546a2c0, 0x546b2d8) , (0x62
ca5b8, 0x63159a8, 0x63152b8) , (0x62ce218, 0x631f360, 0x63159a8) , (0x6315ec8,
0x62d0f80, 0x54659e0) , (0x6315258, 0x63152b8, 0x631f9d0) , (0x62b6f88, 0x546
a2c0, 0x62fffc8) , (0x546b2d8, 0x546aca8, 0x631f950, 0x631f990) , (0x62b6db8,
0x631f9e8, 0x631f5d0, 0x631fa78) , (0x62cc1d8, 0x62b2ee8, 0x62b90c8, 0x631f540)
, (0x631f9d0) , (0x62fffc8) , (0x54659e0) , (0x546aca8) , (0x631f950) , (
0x631f990) , (0x631f9e8) , (0x631f5d0) , (0x631fa78) , (0x62b2ee8) , (0x62b
90c8) , (0x631f540) )
charge_ 0
(выделил для удобства)
Т.е. неинициализированных значений нет. Может помогалка для отладчика (в Креаторе) глючит?

П.С. Малекула прикольно крутится, надо будет разобратся с такими штуками
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kemiisto
  опции профиля:
сообщение 5.9.2009, 18:18
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 5.9.2009
Из: Осло, Норвегия
Пользователь №: 1054

Спасибо сказали: 2 раз(а)




Репутация:   0  


Litkevich Yuriy, спасибо, что не бросаете в беде! :rolleyes:

Цитата(Litkevich Yuriy @ 5.9.2009, 16:34) *
Может помогалка для отладчика (в Креаторе) глючит?

Хм... Врядли.
Оно падает при попытке добавить атом в Render::Viewer::mousePressEvent. Сначала импортируем молекулу, потом пытаемся добавить атом. Доходит до
case MODE_ADD:
      if (found)
      ...
      else
      {
        ...
        chemistryMolecule_.addAtom(chemistryAtom);
      }

идёт в else веточку и падает на addAtom(). Или чуть ниже на updateMolecule(). Так как к этому моменту один из QList в составе Chemistry::Molecule "побит". Бъётся при updateGL(). Какой - зависит от порядка объявления. Вот...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.9.2009, 18:21
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kemiisto @ 5.9.2009, 22:18) *
Сначала импортируем молекулу, потом пытаемся добавить атом.
объясни как это в программе сделать (куда кликать?).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kemiisto
  опции профиля:
сообщение 5.9.2009, 18:32
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 5.9.2009
Из: Осло, Норвегия
Пользователь №: 1054

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 5.9.2009, 17:21) *
объясни как это в программе сделать (куда кликать?).

OK. Сначала Job - Dalton Input. Выбираем последовательно H2O.dal, затем, скажем, caffeine.mol. Видим молекулу. Справа в тулбоксе переходим на вкладку Add. Жмакаем внутри вьювера по пустому месту (мимо атомов). Должен добавится атом (пока прям в начало координат). Но... =(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.9.2009, 18:53
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kemiisto @ 5.9.2009, 22:32) *
Должен добавится атом (пока прям в начало координат). Но... =(
Добавился, а соединения между атомами исчезли
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kemiisto
  опции профиля:
сообщение 5.9.2009, 19:01
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 5.9.2009
Из: Осло, Норвегия
Пользователь №: 1054

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 5.9.2009, 17:53) *
Добавился, а соединения между атомами исчезли

Ага. Такое тоже возможно. Портится список, объявленный первым в Chemistry::Molecule. Сейчас это список связей (QList<Chemistry::Bond*> chemistryBonds_;). Он не обязательно становится недоступным (<internal error>). Иногда оттуда просто исчезают элементы, иногда их там становится бесконечно много. Как бы то ни было, портится список. :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 5.9.2009, 19:09
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


kemiisto,
то что кто первый в объявлении класса тот и "портится" это вполне возможно где то в программе на память "наступил".

ПС.
тоже интересно не могу проект открыть чего то архив сопротивляется. :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.9.2009, 19:12
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kwisp @ 5.9.2009, 23:09) *
тоже интересно не могу проект открыть чего то архив сопротивляется.
Я без проблем открыл, у меня 7z-4.65
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 5.9.2009, 19:31
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


kemiisto,
Chemistry::Molecule::Molecule(const Chemistry::Molecule& chemistryMolecule)
{
  chemistryAtoms_ = QList<Chemistry::Atom*>(chemistryMolecule.chemistryAtoms_);
  chemistryBonds_ = QList<Chemistry::Bond*>(chemistryMolecule.chemistryBonds_);
  incidenceMatrix_ = IncidenceMatrix(chemistryMolecule.incidenceMatrix_);
  charge_ = chemistryMolecule.charge_;
}


вот так не стоит писать..
в этом конструкторе каждый лист создается по 2 раза(если лист имеет конструктор по умолчанию без аргументов).

не знаю, может с оператором присваивания у тебя в классе не лады
ты во вьюер устанавливаешь молекулу в setMolecul(...) т.е. chemistryMolecul_ у тебя уже инициализирован конструктором по умолчанию в конструкторе вьюера( листы пустые там).

ну попробуй
так
Chemistry::Molecule::Molecule(const Chemistry::Molecule& chemistryMolecule):
  chemistryAtoms_(chemistryMolecule.chemistryAtoms_),
  chemistryBonds_(chemistryMolecule.chemistryBonds_),
  incidenceMatrix_ ,(chemistryMolecule.incidenceMatrix_),
  charge_(chemistryMolecule.charge_)
{

}

Chemistry::Molecule& Chemistry::Molecule::operator=(const Chemistry::Molecule& chm)
{
if(this!=&chm){
  chemistryAtoms_ = QList<Chemistry::Atom*>(chm.chemistryAtoms_);
  chemistryBonds_ = QList<Chemistry::Bond*>(chm.chemistryBonds_);
  incidenceMatrix_ = IncidenceMatrix(chm.incidenceMatrix_);
  charge_ = chm.charge_;
}
return *this;
}


Сообщение отредактировал kwisp - 5.9.2009, 19:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

6 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.9.2018, 17:55