| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] QList, полное непонимание =( |
| Автор: kemiisto 27.8.2009, 13:25 | ||||||||
Что-то я совсем ничего не понимаю. Есть у меня класс Atom
Привёл только ту часть, что по моему мнению имеет отношение к делу. bondedIndexes_ хранит индексы атомов, с которыми данный атом связан. Метод bondWith(int index) вносит index в этот список:
Далее есть класс Molecule:
В методе rebond следующий код:
Тут не суть важно условие, главное, что bondWith() вызывается. Беда в том, что при каждом вызове bondWith() список bondedIndexes_ почему то оказывается пустым. В него добавляется index. Но при следующем вызове список снова пуст. И в конце вызова rebond() у всех атомов список bondedIndexes_ оказывается пустым. HELP!!! |
| Автор: just_geek 27.8.2009, 13:45 | ||||||
Так это
Мне кажется или нужно сделать так
update а лучше, заменить
так как value возвращает новый объект. |
| Автор: kemiisto 27.8.2009, 14:50 | ||||||
Изначально было так:
Работает точно также. В смысле, не работает. Можно, конечно, попробовать. Не хочеться иметь список указателей. А это точно что-то изменит? Разве? Добавлено через 2 минуты и 59 секунд Тьфу! И верно! Надо доступ через [] использовать.
|
| Автор: kemiisto 27.8.2009, 17:24 | ||||||
| Продолжаем КВН. Теперь такая беда. Есть такой вот класс:
После того, как отработает конструктор по умолчанию, создаётся объект molecule_. У которого создаётся пустой список atoms_. Всё цивильно. Но стоит потом вызваться методу, скажем, mousePressEvent(), в котором есть такое место:
приложение падает. И писало что-то типа QList: Out of memory. А в режиме отладки напротив этого самого QList значилось <internal error>. Немного погуглив, я наткнулся на http://www.qtcentre.org/forum/archive/index.php/t-7257.html. Переделал чуток, сделав Chemistry::Molecule* molecule_ ну и там в конструкторе явно вызываю:
Теперь оно падает просто без сообщений. А в режиме отладки напротив этого самого QList значицо <out of scope>. HELP!!! |
| Автор: just_geek 27.8.2009, 17:33 |
| А на каких строках падало в обоих случаях? Такое ощущение, что либо память портишь сам. Либо вызываешь функцию не созданного класса. |
| Автор: just_geek 27.8.2009, 17:46 | ||
ну и чему в этом месте равно значение указателя? molecue_ то к этому моменту создано? |
| Автор: kemiisto 27.8.2009, 17:53 |
http://ipicture.ru/ |
| Автор: just_geek 27.8.2009, 18:06 | ||
| гхм а если дальше внутрь функции
пройти ? может где то внутри падает? |
| Автор: kemiisto 27.8.2009, 18:13 | ||||
just_geek, да там код то одна строчка:
Падает при добавлении элемента. Если в debug'е - то останавливается на:
из qbasicatomic.h. |
| Автор: kemiisto 28.8.2009, 11:40 |
| Пытался менять QList на QVector, std::list, std::vector. Никакой разницы. |
| Автор: andrew_121 28.8.2009, 13:35 |
| пересобири Qt(единственное что на ум пришло). |
| Автор: kemiisto 28.8.2009, 13:41 |
| andrew_121, я уж на 3 разных сборках тестил на 3-х разных ОС'ях. Не работает. |
| Автор: fearuth 28.8.2009, 14:21 | ||
Попробуй atoms_.append(atom) заменить на:
|
| Автор: kemiisto 28.8.2009, 14:22 |
| fearuth, пробовал уже. Это одно и тоже. И результат такой же. |
| Автор: fearuth 28.8.2009, 14:27 |
| Может глупость, но зачем знак "_" в конце имени? Попробуй без него. +) |
| Автор: kemiisto 28.8.2009, 14:38 |
Это я так private-члены обозначаю. Довольно распространённый способ. Это не повлияет ни на что. |
| Автор: kemiisto 30.8.2009, 18:09 |
| Up! Помогите! |
| Автор: andrew_121 30.8.2009, 19:04 |
| Выложи весь проект куда-то. Если не секрет конечно |
| Автор: kemiisto 30.8.2009, 19:16 |
| andrew_121, не секрет. Если что-то из этого получиться оно будет Open Source. Если не жалко времени, конечно. Нужно собрать вот эту http://www.libqglviewer.com/. Ты ведь линуксоид. Если из сорсов соберёшь, пути в *.pro должны быть правильные. От хлама вроде почистил... |
| Автор: andrew_121 30.8.2009, 19:21 |
Да. Но собиру под виндавз. Просто сейчас не могу перегрузиться. Оно ведь кросс? |
| Автор: kemiisto 30.8.2009, 19:32 | ||
Ага. Только если для debug собирать - убери строчку
из libQGLViewer-2.3.3\QGLViewer\. Собранную либу кинь QDalton\Libraries\, dll - в Binaries\Windows\. Хотя ты лучше меня в этом смыслишь... |
| Автор: andrew_121 30.8.2009, 20:35 | ||
С этим я согласен. Но вот хидеры libQGLViewer и Eigen включать в поставку проекта не правильно. Это сторонние проекты. |
| Автор: kemiisto 30.8.2009, 21:25 | ||
Согласен, но речи о поставке пока не идёт. |
| Автор: kemiisto 30.8.2009, 22:50 |
| andrew_121, я дико извиняюсь. Не ту версию приаттачил. Перезакачай, если не напряжно. Там проблема из начала топика решена. Но атомы в молекулу не добавить... |
| Автор: andrew_121 30.8.2009, 23:47 |
| kemiisto, Обновился. |
| Автор: andrew_121 31.8.2009, 04:16 |
| http://ipicture.ru/ Собрал с костылями. Приведу в порядок, выложу. |
| Автор: andrew_121 31.8.2009, 06:22 |
| Как и обещал, выкладываю. Собрал - Win32-debug|release, Linux-release. http://rghost.ru/430404 Вкратце. Проблема была не в коде, а в сборке. Нельзя для debug сборки использовать release библиотеки, и на оборот. п.с. Кто программу писал? |
| Автор: kemiisto 31.8.2009, 10:24 | ||
andrew_121,
Я так понимаю, проблема была в *.pro файле? Это моя поделка. |
| Автор: andrew_121 31.8.2009, 10:34 |
Именно. Удивительно... Тогда не понятно твое недовольство языком С++. Довольно высокое качество кода. Лучше большинства проектов выставленных на http://qt-apps.org/ Можешь смело размещать проект. |
| Автор: kemiisto 4.9.2009, 21:35 | ||||
andrew_121, опять та же ситуация. Исходники несколько изменились. Теперь у нас в private секции Chemistry::Molecule сразу 3 QList'а (к тому же один со сложной структурой):
Ну собственно, таже проблема. Отрабатывает конструктор, все 3 списка инициализируются. ![]() При попытке добавить атом в Render::Viewer::mousePressEvent в самом начале ставим точку останова: ![]() Вот. Куда то пропал incidenceMatrix_. Куда? А самое интересное. Если в объявлении поменять местами скажем так:
то на точке останова не будет уже chemistryBonds_ ![]() То есть получается: кто первым объявлен (первым инициализируется в конструкторе?), тот куда-то пропадает. Исходники приложил. |
| Автор: kemiisto 4.9.2009, 22:35 |
| Немного побегал дебагом. Список портится внутри void Render::Viewer::updateMolecule(). До вызова updateGL() всё отлично, после <internal error>. А это метод (точнее слот) QGLViewer'а. И это уже как-то нехорошо... |
| Автор: andrew_121 4.9.2009, 22:54 | ||
Да. В GCC это так. Да нет же. Это в стандарте описано. Не ты. Это креатор его по своему записал(если ты менял проект, не исходники). щас гляну... |
| Автор: kemiisto 5.9.2009, 11:06 |
Я не про порядок вызова конструкторов, а про ситуацию в целом. Я чего то явно не понимаю. А, вообще, язык - полное *****. Как на нём вообще возможно писать? Никогда не знаешь, кто виноват: ты, разработчики компилятора, сторонней библиотеки или стандарта, оставившие слишком много мест с undefined dehaviour, ОС, господь бог, ... |
| Автор: kemiisto 5.9.2009, 12:17 | ||||
| Жесть. Ночь не спал, а толку 0. andrew_121, зато я нашёл прикол в своих исходниках. Вот функция:
Это компилируется. Ерунда, что тип возвращаемого значения беззнаковый, а в одной из веток if я возвращаю -1!
И то warning. Вот это, видимо, и называется строгая типизация. |
| Автор: andrew_121 5.9.2009, 14:39 |
| kemiisto, Снова в ту же степь. Знаешь что плохому танцору мешает? Вот вот, я***. По делу: Нет пока возможности собрать твою программу. Попробуй просто прежний .pro файл подкинь. По идее должно заработать. |
| Автор: kemiisto 5.9.2009, 14:41 | ||||
Сейчас попробую. |
| Автор: kemiisto 5.9.2009, 15:47 |
Нет, видимо, не в этом дело. |
| Автор: andrew_121 5.9.2009, 16:26 |
А под Мас-ом работает? |
| Автор: kemiisto 5.9.2009, 16:36 |
Нет. Нигде не работает. |
| Автор: andrew_121 5.9.2009, 16:39 |
Значит ошибка в коде. |
| Автор: Lazin 5.9.2009, 16:40 |
| kemiisto, у тебя этот объект копируется где нибудь? (в смысле не указатель на него, а именно сам объект, deep copy) |
| Автор: kemiisto 5.9.2009, 16:55 | ||
Не очень понял о каком конкретно объекте идёт речь. Если о chemistryMolecule_, то да. Читаем файл, разбираем, создаём молекулу, передаём вьюверу для отрисовки через void Render::Viewer::setMolecule(const Chemistry::Molecule& chemistryMolecule) Вот я её и пытаюсь локлизовать. |
| Автор: Lazin 5.9.2009, 19:42 | ||||||
я имел ввиду, что объект класса Molecule, может где-нибудь копироваться полностью, ты ведь не определил свой конструктор копирования для него, значит компилятор сделал это за тебя, возможно ты где-то передаешь этот объект по значению, и этот конструктор вызывается и что-то идет не так попробуй определить свой копирующий конструктор и оператор присваивания так -
если код по прежнему будет компилироваться, то проблема в чем-то другом |