Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QList <internal error>
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
Страницы: 1, 2
kemiisto
Здравствуйте!

Если у кого-нибудь найдётся минутка-другая, посмотрите проектик. Исходники тут. Я не стал убирать *.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
В отладчике не смотрел, воткнул 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
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
Цитата(kemiisto @ 5.9.2009, 22:18) *
Сначала импортируем молекулу, потом пытаемся добавить атом.
объясни как это в программе сделать (куда кликать?).
kemiisto
Цитата(Litkevich Yuriy @ 5.9.2009, 17:21) *
объясни как это в программе сделать (куда кликать?).

OK. Сначала Job - Dalton Input. Выбираем последовательно H2O.dal, затем, скажем, caffeine.mol. Видим молекулу. Справа в тулбоксе переходим на вкладку Add. Жмакаем внутри вьювера по пустому месту (мимо атомов). Должен добавится атом (пока прям в начало координат). Но... =(
Litkevich Yuriy
Цитата(kemiisto @ 5.9.2009, 22:32) *
Должен добавится атом (пока прям в начало координат). Но... =(
Добавился, а соединения между атомами исчезли
kemiisto
Цитата(Litkevich Yuriy @ 5.9.2009, 17:53) *
Добавился, а соединения между атомами исчезли

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

ПС.
тоже интересно не могу проект открыть чего то архив сопротивляется. :(
Litkevich Yuriy
Цитата(kwisp @ 5.9.2009, 23:09) *
тоже интересно не могу проект открыть чего то архив сопротивляется.
Я без проблем открыл, у меня 7z-4.65
kwisp
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;
}
BRE
Цитата(kwisp @ 5.9.2009, 20:31) *
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 раза(если лист имеет конструктор по умолчанию без аргументов).

Причем копируются только указатели, а не сами объекты атомов и связей. Если бы был деструктор корректно уничтожающий все объекты атомов и связей, проблемы начались бы раньше. ;)
Кстати в матрице тоже список указателей.
kwisp
ну да по идее у 2 разных молекул должны быть разные атомы...
BRE
Жаль под linux собрать не могу, по исходникам не легко разбираться. :unsure:
kemiisto
BRE, kwisp, я учитываю ваши комментарии. Спасибо. Избавлюсь от ссылок в списках, вспомню об инициализаторах в конструкторах, ... Потихоньку перепишу, а там видно будет.

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

Сейчас гляну, но у меня еще на этапе компиляции проекта kemiisto ошибку выдает. Разбираться придется.
kemiisto
Цитата(kwisp @ 5.9.2009, 18:31) *
ну попробуй
так

Не помогает. :wacko:
kwisp
kemiisto,
значит надо досканалнее. глянуть.
расскажи где ты удаляешь атомы?
подумай где можешь наступать на память?
kemiisto
kwisp, хорошо. Напишу explicit деструкторы для классов, погоняю код. А там видно будет. :scratch_one-s_head:
kemiisto
Ну вот, потихоньку изменил код. Убрал пока указатели где только возможно. Нашлись ошибки! ;)

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

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

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

Архивчик обновил. Может посмотрите?
Kagami
У меня не собирается
Раскрывающийся текст
Цитата
Sources/Render/RenderViewer.cpp: In member function ‘virtual void Render::Viewer::draw()’:
Sources/Render/RenderViewer.cpp:144: error: ‘((Render::Viewer*)this)->QWidget::font’ does not have class type
Sources/Render/RenderViewer.cpp:145: error: no matching function for call to ‘Render::Viewer::renderText(int, int, const char [11], <unresolved overloaded function type>)’
/usr/include/qt4/QtOpenGL/qgl.h:441: note: candidates are: void QGLWidget::renderText(int, int, const QString&, const QFont&, int)
/usr/include/qt4/QtOpenGL/qgl.h:443: note: void QGLWidget::renderText(double, double, double, const QString&, const QFont&, int)
Sources/Render/RenderViewer.cpp:146: error: ‘((Render::Viewer*)this)->QWidget::font’ does not have class type
Sources/Render/RenderViewer.cpp:150: error: no matching function for call to ‘Render::Viewer::renderText(int, int, const char [11], <unresolved overloaded function type>)’
/usr/include/qt4/QtOpenGL/qgl.h:441: note: candidates are: void QGLWidget::renderText(int, int, const QString&, const QFont&, int)
/usr/include/qt4/QtOpenGL/qgl.h:443: note: void QGLWidget::renderText(double, double, double, const QString&, const QFont&, int)
Sources/Render/RenderViewer.cpp:158: error: no matching function for call to ‘Render::Viewer::renderText(int, int, const char [10], <unresolved overloaded function type>)’
/usr/include/qt4/QtOpenGL/qgl.h:441: note: candidates are: void QGLWidget::renderText(int, int, const QString&, const QFont&, int)
/usr/include/qt4/QtOpenGL/qgl.h:443: note: void QGLWidget::renderText(double, double, double, const QString&, const QFont&, int)
Sources/Render/RenderViewer.cpp:161: error: no matching function for call to ‘Render::Viewer::renderText(int, int, QString, <unresolved overloaded function type>)’
/usr/include/qt4/QtOpenGL/qgl.h:441: note: candidates are: void QGLWidget::renderText(int, int, const QString&, const QFont&, int)
/usr/include/qt4/QtOpenGL/qgl.h:443: note: void QGLWidget::renderText(double, double, double, const QString&, const QFont&, int)
Sources/Render/RenderViewer.cpp:166: error: no matching function for call to ‘Render::Viewer::renderText(int, int, QString, <unresolved overloaded function type>)’
/usr/include/qt4/QtOpenGL/qgl.h:441: note: candidates are: void QGLWidget::renderText(int, int, const QString&, const QFont&, int)
/usr/include/qt4/QtOpenGL/qgl.h:443: note: void QGLWidget::renderText(double, double, double, const QString&, const QFont&, int)
Sources/Render/RenderViewer.cpp:168: error: no matching function for call to ‘Render::Viewer::renderText(int, int, QString, <unresolved overloaded function type>)’
/usr/include/qt4/QtOpenGL/qgl.h:441: note: candidates are: void QGLWidget::renderText(int, int, const QString&, const QFont&, int)
/usr/include/qt4/QtOpenGL/qgl.h:443: note: void QGLWidget::renderText(double, double, double, const QString&, const QFont&, int)
make[1]: *** [Build/Objects/release/RenderViewer.o] Ошибка 1

P.S. Debian GNU/Linux Squeeze

P.P.S. Из-за вот этого куска:
#ifdef __APPLE__
    QFont font("Monaco", 12);
#endif
#ifdef _WIN32
    QFont font("Luicida Console", 8);
#endif

Судя по-всему, поддержка линукса не предусмотрена :(
kemiisto
Цитата(Kagami @ 6.9.2009, 21:06) *
Судя по-всему, поддержка линукса не предусмотрена

Добавьте что-нибудь типа:
#ifdef linux
    QFont font()
#endif

и должно работать на Linux.

#ifdef linux
    QFont font;
#endif


А где тут на форуме кнопка "Редактировать сообщение"?
Kagami
Что-нибудь типа... Хех. http://doc.trolltech.com/4.5/qtglobal.html#Q_WS_X11
#ifdef Q_WS_X11
    QFont font;
#endif


P.S. Появится после 20-ти сообщений
kemiisto
Начинаем набирать 20 сообщений. ;)

Цитата(Kagami @ 6.9.2009, 22:35) *
Что-нибудь типа... Хех. http://doc.trolltech.com/4.5/qtglobal.html#Q_WS_X11

:blush: Вам виднее. Кстати, мне это пригодится.

Та терь, вообще, можно эти дефайны убрать. Раньше на Яблоке были проблемы.
Litkevich Yuriy
Цитата(kemiisto @ 7.9.2009, 2:53) *
А где тут на форуме кнопка "Редактировать сообщение"?
20 сообщений наберёшь появится.

Цитата(Kagami @ 7.9.2009, 3:35) *
Q_WS_X11
WS -window system, а есть ещё с буквами OS - Q_OS_LINUX
kwisp
Цитата(kemiisto @ 5.9.2009, 19:32) *
Жмакаем внутри вьювера по пустому месту (мимо атомов). Должен добавится атом (пока прям в начало координат). Но... =(

у меня добавился и ничего не упало...
это правильно?
kemiisto
Цитата(kwisp @ 7.9.2009, 12:33) *
у меня добавился и ничего не упало...
это правильно?

А Вы перед этим молекулу импортировали? Попробуйте добавить атом к импортированной молекуле.
kwisp
kemiisto,
добавляю и к импортированной через раз. баг ваш не стабильный нужно четче отследить ситуацию при которой он возникает.
делаю все как вы писали Юрию. потом перед тем как кликнуть на пустом месте просто немного поворачиваю молекулу прехожу по вкладкам job и проч и потом атом в центр добавляется...
kemiisto
kwisp, я туперь на 100% уверен, что неправильно собирал QGLViewer. Я там *.pro файл немного правил. Но вот, что интересно. Там в QGLViewer/QGLViewer.pro в самом начале есть строчка:
CONFIG -= debug debug_and_release
CONFIG *= release qt opengl warn_on shared thread create_prl rtti


Я так понимаю, с такими строчками debug версии либы заиметь не получится. Но в самом низу:
win32 {
  CONFIG -= release
  CONFIG += debug_and_release build_all

То есть для windows обратно меняем ситуацию.

Вот сейчас nmake у меня собрал и debug и release. А MinGW make не собирал раньше debug. А на Mac OS X там вообще всё очень хитро с этими framework'ами... Короче, если собирать QGLViewer как дадено - вроде бы проблемы нет.

kwisp, а Вы его сами собирали? Если да, где и как?
kwisp
kemiisto, вопрос конечно интересный.
я собирал на работе по винду MiGW 3.4.3зашел в директорию проекта файл проекта даже не открывал скомандовал qmake и make и всё:)
вот бы узнать как криво собранная библиотека портит твои списки? мистика прям:)
Kagami
Кстати, а на предупреждения компилятора никто не смотрел? Может в них собака зарыта?
Раскрывающийся текст
Цитата
Sources/Render/RenderAtom.cpp: In member function ‘const QString& Render::Atom::label() const’:
Sources/Render/RenderAtom.cpp:164: warning: returning reference to temporary
Sources/File/FileDal.cpp: In member function ‘bool File::Dal::hasParametre(const QString&, const QString&, const QString&)’:
Sources/File/FileDal.cpp:156: warning: comparison is always true due to limited range of data type
Sources/File/FileDal.cpp:159: warning: comparison is always true due to limited range of data type
Sources/File/FileDal.cpp:162: warning: comparison is always true due to limited range of data type
kwisp
я не помню. потому что поставил на сборку и ушел обедать.
поэтому не видел процесса сборки.
Kagami
У меня вроде все работает и ничего не падает. Атом в центр координат добавляется. Кстати, в молекуле сразу после импорта одной связи нету.

P.S. Для сборки под дебианом пришлось поставить QGLViewer
Цитата
$ sudo apt-get install libqglviewer-qt4-dev

и подправить файл проекта
linux-g++ {
  DESTDIR = Binaries/Linux
  LIBS *= -L/usr/lib -lqglviewer-qt4
}
kemiisto
Цитата(Kagami @ 7.9.2009, 19:32) *
Кстати, в молекуле сразу после импорта одной связи нету.

Это бага. Я её уже отловил.

Должно быть так:
void Render::Viewer::updateRenderBonds()
{
  renderBondsList_.clear();
  for (quint16 i = 0; i < chemistryMolecule_.bondsCount(); ++i)
  {
    Render::Bond renderBond(chemistryMolecule_.chemistryBond(i));
    addBond(renderBond);
  }
}

а было i < chemistryMolecule_.bondsCount() - 1.

Надо отучать себя от for'а. Но никак не могу заставить себя... :blush2:

Забавно. У меня на Mac OS атом сразу добавляется, а на Windows - нет. Но тут надо возится и с OpenGL...

Всем помогающим огромное спасибо.
kemiisto
: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
Цитата(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);
}

kwisp
я подозре\ваю что у второго атома в списке не валидный указатель на molecule_.
где атом получает указатель на молекулу?
BRE
Цитата(kwisp @ 8.9.2009, 20:11) *
я подозре\ваю что у второго атома в списке не валидный указатель на molecule_.
где атом получает указатель на молекулу?

Смотри конструктор и оператор копирования.... ;)
Предполагаю, такие штучки с циклами можно ожидать и в других местах.
kemiisto, проверь другие циклы на предмет < count() -1.
BRE
[Дубль.]
[Блин, почему такие ошибки с редактированием сообщения происходят, приходиться по несколько раз сообщения набирать :unsure: ]
kemiisto
Цитата(BRE @ 8.9.2009, 18:08) *
В конструкторе и операторе копирования в циклах не нужно вычитать единицу, у тебя же условие <.

Тьфу ты. Опять на теже грабли. :blush:
За Q_ASSERT тоже спасибо.
kwisp
Цитата(BRE @ 8.9.2009, 20:15) *
Смотри конструктор и оператор копирования.... ;)

вот смотрю и нашел только что в конструкторе копий опять(не в списке инициализации) такая вещь:
Render::Atom::Atom(const Render::Atom& atom)
{
  molecule_ = atom.molecule_; // вот здесь получает указатель на молекулу.
  protons_ = atom.protons_;
  neutrons_ = atom.neutrons_;
  centre_ = atom.centre_;
  isSelected_ = atom.isSelected_;
  isMovable_ = atom.isMovable_;
}

болше я не нашел мест где происходит получение этого указателя... :(
может я чего то не понимаю...


думаю тут что то не так.
BRE
Не забудь исправить File::Dal::hasParametre(...).
Или используй signed или не проверяй на -1.
Компилятор зря не предупреждает. ;)

Цитата(kwisp @ 8.9.2009, 20:33) *
болше я не нашел мест где происходит получение этого указателя... :(
может я чего то не понимаю...

Ты в классе Molecule посмотри.
kwisp
Цитата(BRE @ 8.9.2009, 20:36) *
Ты в классе Molecule посмотри.

а нашел.. прошляпил что указатель у него public:
:)
думаю надо эту draw(..) крутить.
еще вопрос
const Atom& Molecule::atom(quint16 index)
{
return atomList_.at(index);
}

в дебажной версии может проверят стоит не выходит ли index за границы списка?
kemiisto
Цитата(BRE @ 8.9.2009, 18:36) *
Не забудь исправить File::Dal::hasParametre(...).
Или используй signed или не проверяй на -1.

Это да. ;) Хотя, признаться, я бы на месте компилятора просто не компилировал такое...
BRE
Цитата(kemiisto @ 8.9.2009, 20:57) *
Это да. ;) Хотя, признаться, я бы на месте компилятора просто не компилировал такое...

Нужно его только попросить и он не будет... :)
kemiisto
Цитата(BRE @ 8.9.2009, 19:05) *
Нужно его только попросить и он не будет... :)

Это Вы про что-то вроде g++ -W -Wall -Werror?
BRE
Цитата(kemiisto @ 8.9.2009, 21:42) *
Цитата(BRE @ 8.9.2009, 19:05) *
Нужно его только попросить и он не будет... :)

Это Вы про что-то вроде g++ -W -Wall -Werror?

Да.
Если можно, то лучше на ты. :)
kemiisto
Цитата(BRE @ 8.9.2009, 20:21) *
Да.

Я добавил в файл проекта QMAKE_CXXFLAGS *= -W -Wall. -Werror не катить. Он у меня ругается на void retranslateUi(QMainWindow *MainWindow) из ui_MainWindow.h.
warning: unused parameter 'MainWindow'


Но не суть важно.

Цитата(BRE @ 8.9.2009, 20:21) *
Если можно, то лучше на ты.

Лады.
BRE
Цитата(kemiisto @ 8.9.2009, 22:31) *
Я добавил в файл проекта QMAKE_CXXFLAGS *= -W -Wall. -Werror не катить. Он у меня ругается на void retranslateUi(QMainWindow *MainWindow) из ui_MainWindow.h.
warning: unused parameter 'MainWindow'


Но не суть важно.

В этом режиме предупреждений быть не должно совсем.
Или используй переменную MainWindow или сделай ее не видимой.

Да на самом деле проще этим режимом не пользоваться, а следить за предупреждениями и по возможности исправлять, что бы их не было.
kwisp
ну что как успехи в ловле бага?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.