crossplatform.ru

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

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:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
kemiisto
  опции профиля:
сообщение 8.9.2009, 18:30
Сообщение #2


Студент
*

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

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




Репутация:   0  


:help:

Ну, я практически локализовал баг. Но абсолютно не понимаю, как такое происходит. Я реорганизовал код, объединил классы, ... И вот, что происходит. Импорт молекулы проходит нормально (я добавил небольшую молекулку воды для удобства отладки).

Потом мы пытаемся добавить атом. Он добавляется в список атомов. Начинается перерисовка списков отображения OpenGL. Доходит до формирования списка связей - метод GLuint Render::Viewer::makeSticks(Quality quality):
{
  GLuint list = glGenLists(1);
  glNewList(list, GL_COMPILE);
  {
    QListIterator<Render::Bond> i(molecule_.bondsList_);
    while (i.hasNext())
    {
      i.next().draw(quality);
    }
  }
  glEndList();
  return list;
}

Создаём итератор и поехали! Списко атомов, связей пока ещё не попорчены. Вызываем метод draw для первой связи. Оказываемся внутри void Render::Bond::draw(Quality quality) const. Как в начале метода, так и в конце списки живы.

Возвращаемся обратно в makeSticks(). Списки по-прежнему живы. Снова заходим в draw()... И получаем epic fail! В списках какой-то мусор! :o:

Если будет у кого минутка, посмотрите, пожалуйста...

Архив.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.9.2009, 19:08
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(kemiisto @ 8.9.2009, 19:30) *
:help:


В конструкторе и операторе копирования в циклах не нужно вычитать единицу, у тебя же условие <.
Раскрывающийся текст

Render::Molecule::Molecule(const Render::Molecule& chemistryMolecule) :
    atomsList_(chemistryMolecule.atomsList_),
    bondsList_(chemistryMolecule.bondsList_),
    incidenceMatrix_(chemistryMolecule.incidenceMatrix_),
    charge_(chemistryMolecule.charge_)
{
  for (quint16 i = 0; i < atomsCount(); ++i)
  {
    atomsList_[i].molecule_ = this;
  }
  for (quint16 i = 0; i < bondsCount(); ++i)
  {
    bondsList_[i].molecule_ = this;
  }
}

Render::Molecule& Render::Molecule::operator=(const Render::Molecule& molecule)
{
  if (this != &molecule)
  {
    atomsList_ = QList<Render::Atom>(molecule.atomsList_);
    bondsList_ = QList<Render::Bond>(molecule.bondsList_);
    incidenceMatrix_ = IncidenceMatrix(molecule.incidenceMatrix_);
    charge_ = molecule.charge_;
  }
  for (quint16 i = 0; i < atomsCount(); ++i)
  {
    atomsList_[i].molecule_ = this;
  }
  for (quint16 i = 0; i < bondsCount(); ++i)
  {
    bondsList_[i].molecule_ = this;
  }
  return *this;
}

//
// Стоит проверять index на предмет выхода за пределы списка
//

const Render::Atom& Render::Molecule::atom(quint16 index) const
{
  Q_ASSERT( index < atomsList_.size() );
  return atomsList_.at(index);
}

const Render::Bond& Render::Molecule::bond(quint16 index) const
{
  Q_ASSERT( index < boundsList_.size() );
  return bondsList_.at(index);
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- kemiisto   QList <internal error>   5.9.2009, 16:34
- - Litkevich Yuriy   В отладчике не смотрел, воткнул qDebug в Chemistry...   5.9.2009, 17:34
- - kemiisto   Litkevich Yuriy, спасибо, что не бросаете в беде...   5.9.2009, 18:18
- - Litkevich Yuriy   Цитата(kemiisto @ 5.9.2009, 22:18) Сначал...   5.9.2009, 18:21
- - kemiisto   Цитата(Litkevich Yuriy @ 5.9.2009, 17:21)...   5.9.2009, 18:32
- - Litkevich Yuriy   Цитата(kemiisto @ 5.9.2009, 22:32) Должен...   5.9.2009, 18:53
- - kemiisto   Цитата(Litkevich Yuriy @ 5.9.2009, 17:53)...   5.9.2009, 19:01
- - kwisp   kemiisto, то что кто первый в объявлении класса то...   5.9.2009, 19:09
- - Litkevich Yuriy   Цитата(kwisp @ 5.9.2009, 23:09) тоже инте...   5.9.2009, 19:12
- - kwisp   kemiisto, Chemistry::Molecule::Mo...   5.9.2009, 19:31
|- - BRE   Цитата(kwisp @ 5.9.2009, 20:31) kemiisto,...   5.9.2009, 19:40
- - kwisp   ну да по идее у 2 разных молекул должны быть разны...   5.9.2009, 20:25
|- - BRE   Жаль под linux собрать не могу, по исходникам не л...   5.9.2009, 20:41
- - kemiisto   BRE, kwisp, я учитываю ваши комментарии. Спасибо. ...   5.9.2009, 20:42
- - Litkevich Yuriy   Цитата(BRE @ 6.9.2009, 0:41) Жаль под lin...   5.9.2009, 21:24
|- - BRE   Цитата(Litkevich Yuriy @ 5.9.2009, 22:24)...   5.9.2009, 21:28
- - kemiisto   Цитата(kwisp @ 5.9.2009, 18:31) ну попроб...   5.9.2009, 21:46
- - kwisp   kemiisto, значит надо досканалнее. глянуть. расс...   5.9.2009, 22:52
- - kemiisto   kwisp, хорошо. Напишу explicit деструкторы для кла...   6.9.2009, 1:22
|- - kemiisto   Ну вот, потихоньку изменил код. Убрал пока указате...   6.9.2009, 20:05
- - Kagami   У меня не собирается Раскрывающийся текстЦитатаSou...   6.9.2009, 22:06
- - kemiisto   Цитата(Kagami @ 6.9.2009, 21:06) Судя по-...   6.9.2009, 22:53
- - Kagami   Что-нибудь типа... Хех. http://doc.trolltech.com/4...   6.9.2009, 23:35
- - kemiisto   Начинаем набирать 20 сообщений. Цитата(Kagami ...   6.9.2009, 23:41
- - Litkevich Yuriy   Цитата(kemiisto @ 7.9.2009, 2:53) А где т...   6.9.2009, 23:49
- - kwisp   Цитата(kemiisto @ 5.9.2009, 19:32) Жмакае...   7.9.2009, 13:33
- - kemiisto   Цитата(kwisp @ 7.9.2009, 12:33) у меня до...   7.9.2009, 14:08
- - kwisp   kemiisto, добавляю и к импортированной через раз....   7.9.2009, 14:15
- - kemiisto   kwisp, я туперь на 100% уверен, что неправильно со...   7.9.2009, 17:05
- - kwisp   kemiisto, вопрос конечно интересный. я собирал на ...   7.9.2009, 18:58
- - Kagami   Кстати, а на предупреждения компилятора никто не с...   7.9.2009, 20:13
- - kwisp   я не помню. потому что поставил на сборку и ушел о...   7.9.2009, 20:19
- - Kagami   У меня вроде все работает и ничего не падает. Атом...   7.9.2009, 20:32
- - kemiisto   Цитата(Kagami @ 7.9.2009, 19:32) Кстати, ...   7.9.2009, 21:02
- - kemiisto   Ну, я практически локализовал баг. Но абсолютно не...   8.9.2009, 18:30
|- - BRE   Цитата(kemiisto @ 8.9.2009, 19:30) В ко...   8.9.2009, 19:08
- - kwisp   я подозре\ваю что у второго атома в списке не...   8.9.2009, 19:11
|- - BRE   Цитата(kwisp @ 8.9.2009, 20:11) я подозре...   8.9.2009, 19:15
|- - BRE   [Дубль.] [Блин, почему такие ошибки с редактирован...   8.9.2009, 19:16
- - kemiisto   Цитата(BRE @ 8.9.2009, 18:08) В конструкт...   8.9.2009, 19:27
|- - BRE   Не забудь исправить File::Dal::hasParametre(...). ...   8.9.2009, 19:36
- - kwisp   Цитата(BRE @ 8.9.2009, 20:15) Смотри конс...   8.9.2009, 19:33
- - kwisp   Цитата(BRE @ 8.9.2009, 20:36) Ты в классе...   8.9.2009, 19:40
- - kemiisto   Цитата(BRE @ 8.9.2009, 18:36) Не забудь и...   8.9.2009, 19:57
|- - BRE   Цитата(kemiisto @ 8.9.2009, 20:57) Это да...   8.9.2009, 20:05
- - kemiisto   Цитата(BRE @ 8.9.2009, 19:05) Нужно его т...   8.9.2009, 20:42
|- - BRE   Цитата(kemiisto @ 8.9.2009, 21:42) Цитата...   8.9.2009, 21:21
- - kemiisto   Цитата(BRE @ 8.9.2009, 20:21) Да. Я добав...   8.9.2009, 21:31
|- - BRE   Цитата(kemiisto @ 8.9.2009, 22:31) Я доба...   8.9.2009, 21:34
- - kwisp   ну что как успехи в ловле бага?   10.9.2009, 14:04
- - kemiisto   Цитата(kwisp @ 10.9.2009, 13:04) ну что к...   10.9.2009, 14:23
- - kwisp   kemiisto, так где собака была зарыта?   10.9.2009, 14:36
- - kemiisto   Цитата(kwisp @ 10.9.2009, 13:36) kemiisto...   10.9.2009, 15:02


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 13.7.2025, 6:57