![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
kemiisto |
![]() ![]()
Сообщение
#1
|
![]() Студент ![]() Группа: Участник Сообщений: 27 Регистрация: 5.9.2009 Из: Осло, Норвегия Пользователь №: 1054 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Здравствуйте!
Если у кого-нибудь найдётся минутка-другая, посмотрите проектик. Исходники тут. Я не стал убирать *.dll и *.a от QGLViewer'а и инклюды от QGLViewer'а и Eigen'а. Так чтоб под Windows собиралось "из коробки"... Я первый раз пишу на ++ и проект только-только начинается. Так что там много методов-пустышек и "говнокода". ![]() Собственно, беда такая. Есть у нас класс (молекула)
В Render::Viewer попытка использовать экземпляр этого класса
Попытка не совсем успешная. Когда отрабатывает конструктор Chemistry::Molecule, все 3 списка инициализируются. ![]() При попытке добавить атом в Render::Viewer::mousePressEvent в самом начале ставим точку останова: ![]() Вот. Куда то пропал incidenceMatrix_. Куда? А самое интересное. Если в объявлении поменять местами скажем так:
то на точке останова не будет уже chemistryBonds_. То есть получается: кто первым объявлен (первым инициализируется в конструкторе), тот куда-то пропадает. Немного побегал дебагом. Список портится внутри void Render::Viewer::updateMolecule(). До вызова updateGL() всё отлично, после <internal error>. А это метод (точнее слот) QGLViewer'а. Мыслей больше нет. ![]() |
|
|
![]() |
kemiisto |
![]() ![]()
Сообщение
#2
|
![]() Студент ![]() Группа: Участник Сообщений: 27 Регистрация: 5.9.2009 Из: Осло, Норвегия Пользователь №: 1054 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
![]() Ну, я практически локализовал баг. Но абсолютно не понимаю, как такое происходит. Я реорганизовал код, объединил классы, ... И вот, что происходит. Импорт молекулы проходит нормально (я добавил небольшую молекулку воды для удобства отладки). Потом мы пытаемся добавить атом. Он добавляется в список атомов. Начинается перерисовка списков отображения OpenGL. Доходит до формирования списка связей - метод GLuint Render::Viewer::makeSticks(Quality quality):
Создаём итератор и поехали! Списко атомов, связей пока ещё не попорчены. Вызываем метод draw для первой связи. Оказываемся внутри void Render::Bond::draw(Quality quality) const. Как в начале метода, так и в конце списки живы. Возвращаемся обратно в makeSticks(). Списки по-прежнему живы. Снова заходим в draw()... И получаем epic fail! В списках какой-то мусор! ![]() Если будет у кого минутка, посмотрите, пожалуйста... Архив. |
|
|
BRE |
![]()
Сообщение
#3
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
![]() В конструкторе и операторе копирования в циклах не нужно вычитать единицу, у тебя же условие <. Раскрывающийся текст
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 13.7.2025, 6:57 |