crossplatform.ru

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

kemiisto
  опции профиля:
сообщение 5.9.2009, 16:34
Сообщение #1


Студент
*

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

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




Репутация:   0  


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

Если у кого-нибудь найдётся минутка-другая, посмотрите проектик. Исходники Link. Я не стал убирать *.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:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
6 страниц V  < 1 2 3 4 > »   
Начать новую тему
Ответов (10 - 19)
BRE
  опции профиля:
сообщение 5.9.2009, 19:40
Сообщение #11


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

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

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




Репутация:   44  


Цитата(kwisp @ 5.9.2009, 20:31) Link
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 раза(если лист имеет конструктор по умолчанию без аргументов).

Причем копируются только указатели, а не сами объекты атомов и связей. Если бы был деструктор корректно уничтожающий все объекты атомов и связей, проблемы начались бы раньше. ;)
Кстати в матрице тоже список указателей.

Сообщение отредактировал BRE - 5.9.2009, 19:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 5.9.2009, 20:25
Сообщение #12


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

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

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




Репутация:   23  


ну да по идее у 2 разных молекул должны быть разные атомы...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 5.9.2009, 20:41
Сообщение #13


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

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

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




Репутация:   44  


Жаль под linux собрать не могу, по исходникам не легко разбираться. :unsure:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kemiisto
  опции профиля:
сообщение 5.9.2009, 20:42
Сообщение #14


Студент
*

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

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




Репутация:   0  


BRE, kwisp, я учитываю ваши комментарии. Спасибо. Избавлюсь от ссылок в списках, вспомню об инициализаторах в конструкторах, ... Потихоньку перепишу, а там видно будет.

Тему не закрываю пока.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.9.2009, 21:24
Сообщение #15


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

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

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




Репутация:   94  


Цитата(BRE @ 6.9.2009, 0:41) Link
Жаль под linux собрать не могу, по исходникам не легко разбираться.
тебе наверно надо QGLViewer собрать сначала (Link)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 5.9.2009, 21:28
Сообщение #16


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

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

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




Репутация:   44  


Цитата(Litkevich Yuriy @ 5.9.2009, 22:24) Link
Цитата(BRE @ 6.9.2009, 0:41) Link
Жаль под linux собрать не могу, по исходникам не легко разбираться.
тебе наверно надо QGLViewer собрать сначала (Link)

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


Студент
*

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

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




Репутация:   0  


Цитата(kwisp @ 5.9.2009, 18:31) Link
ну попробуй
так

Не помогает. :wacko:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 5.9.2009, 22:52
Сообщение #18


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

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

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




Репутация:   23  


kemiisto,
значит надо досканалнее. глянуть.
расскажи где ты удаляешь атомы?
подумай где можешь наступать на память?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kemiisto
  опции профиля:
сообщение 6.9.2009, 1:22
Сообщение #19


Студент
*

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

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




Репутация:   0  


kwisp, хорошо. Напишу explicit деструкторы для классов, погоняю код. А там видно будет. :scratch_one-s_head:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kemiisto
  опции профиля:
сообщение 6.9.2009, 20:05
Сообщение #20


Студент
*

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

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




Репутация:   0  


Ну вот, потихоньку изменил код. Убрал пока указатели где только возможно. Нашлись ошибки! ;)

Во-первых, вот тут был бред:
Chemistry::Bond::Bond(const Chemistry::Bond& chemistryBond)
{
  chemistryMolecule_ = chemistryMolecule_;
  beginIndex_ = chemistryBond.beginIndex_;
  endIndex_ = chemistryBond.endIndex_;
}

В первой строчке в теле. Ну это ляп, конечно же. Когда начал переписывать со списками инициализаторов - заметил.

Ну и там ещё по мелочи. Но толку нет. Симптомы теже. Портятся мои списки. :unknw:

Архивчик Link. Может посмотрите?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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