Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] QList, полное непонимание =( 
:(
    Опции темы
kemiisto
  Дата 27.8.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 8
Всего: 160



Что-то я совсем ничего не понимаю. Есть у меня класс Atom
Код

namespace Chemistry
{
  class Atom
  {
  public:
    ...
    void bondWith(int index);
    
  private:
    ...
    QList<int> bondedIndexes_;
  };
} // namespace Chemistry


Привёл только ту часть, что по моему мнению имеет отношение к делу. 

bondedIndexes_ хранит индексы атомов, с которыми данный атом связан.

Метод bondWith(int index) вносит index в этот список:
Код

void Chemistry::Atom::bondWith(int index)
{
  bondedIndexes_.append(index);
}


Далее есть класс Molecule:
Код

namespace Chemistry
{
  class Molecule
  {
  public:
    ...
    void rebond();

  private:
    ...
    QList<Chemistry::Atom>* atoms_;
  };
} // namespace Chemistry


В методе rebond следующий код:
Код

void Chemistry::Molecule::rebond()
{
  for (int i = 0; i < atomsCount() - 1; ++i)
  {
    for (int j = i + 1; j < atomsCount(); ++j)
    {
      if (interatomicDistance(i, j) <
          atom(i).covalentRadius() + atom(j).covalentRadius() + tolerance)
      {
        atoms_->value(i).bondWith(j);
        atoms_->value(j).bondWith(i);
      }
    }
  }
}


Тут не суть важно условие, главное, что bondWith() вызывается.

Беда в том, что при каждом вызове bondWith() список bondedIndexes_ почему то оказывается пустым. В него добавляется index. Но при следующем вызове список снова пуст. И в конце вызова rebond() у всех атомов список bondedIndexes_ оказывается пустым. smile 

HELP!!!

Это сообщение отредактировал(а) kemiisto - 27.8.2009, 13:27


--------------------
PM MAIL WWW GTalk Jabber   Вверх
just_geek
Дата 27.8.2009, 13:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: 7
Всего: 10



Так это

Код

QList<Chemistry::Atom>* atoms_;

Мне кажется или нужно сделать так 

Код

QList<Chemistry::Atom*> atoms_;


update
а лучше, заменить 
Код

atoms_->value(i).bondWith(j);
// на
atoms_->at(i).bondWith(j);

так как value возвращает новый объект.

Это сообщение отредактировал(а) just_geek - 27.8.2009, 14:24
PM MAIL   Вверх
kemiisto
Дата 27.8.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 8
Всего: 160



Цитата(just_geek @  27.8.2009,  14:45 Найти цитируемый пост)
Мне кажется или нужно сделать так

Изначально было так:
Код

namespace Chemistry
{
  class Molecule
  {
  public:
    ...
    void rebond();
  private:
    ...
    QList<Chemistry::Atom> atoms_;
  };
} // namespace Chemistry


Код

void Chemistry::Molecule::rebond()
{
  for (int i = 0; i < atomsCount() - 1; ++i)
  {
    for (int j = i + 1; j < atomsCount(); ++j)
    {
      if (interatomicDistance(i, j) <
          atom(i).covalentRadius() + atom(j).covalentRadius() + tolerance)
      {
        atoms_.value(i).bondWith(j);
        atoms_.value(j).bondWith(i);
      }
    }
  }
}


Работает точно также. В смысле, не работает. smile 


Цитата(just_geek @  27.8.2009,  14:45 Найти цитируемый пост)

Код

QList<Chemistry::Atom*> atoms_;


Можно, конечно, попробовать. Не хочеться иметь список указателей. А это точно что-то изменит?

Цитата(just_geek @  27.8.2009,  14:45 Найти цитируемый пост)

так как value возвращает новый объект.

Разве? smile

Добавлено через 2 минуты и 59 секунд
Цитата(kemiisto @  27.8.2009,  15:50 Найти цитируемый пост)
Разве?

Тьфу! И верно! Надо доступ через [] использовать.
Код

atoms_[i].bondWith(j);


Это сообщение отредактировал(а) kemiisto - 27.8.2009, 14:51


--------------------
PM MAIL WWW GTalk Jabber   Вверх
kemiisto
  Дата 27.8.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 8
Всего: 160



Продолжаем КВН. smile 

Теперь такая беда. Есть такой вот класс:
Код

namespace Render
{
  class Viewer : public QGLViewer
  {
    Q_OBJECT
    ...
  protected:
    virtual void mousePressEvent(QMouseEvent* e);
    ...

  private:
    ...
    Chemistry::Molecule molecule_;
};


После того, как отработает конструктор по умолчанию, создаётся объект molecule_. У которого создаётся пустой список atoms_. Всё цивильно. Но стоит потом вызваться методу, скажем, mousePressEvent(), в котором есть такое место:
Код

Chemistry::Atom chemistryAtom; // создали атом
chemistryAtom.setProtons(atomicNumber_); // установили свойства
molecule_->addAtom(chemistryAtom); // пытаемся добавить

приложение падает. smile 

И писало что-то типа QList: Out of memory. А в режиме отладки напротив этого самого QList значилось <internal error>. Немного погуглив, я наткнулся на это

Переделал чуток, сделав Chemistry::Molecule* molecule_ ну и там в конструкторе явно вызываю:
Код

molecule_ = new Chemistry::Molecule();


Теперь оно падает просто без сообщений. А в режиме отладки напротив этого самого QList значицо <out of scope>.

HELP!!!


--------------------
PM MAIL WWW GTalk Jabber   Вверх
just_geek
Дата 27.8.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: 7
Всего: 10



А на каких строках падало в обоих случаях? Такое ощущение, что либо память портишь сам. Либо вызываешь функцию не созданного класса.
PM MAIL   Вверх
kemiisto
Дата 27.8.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 8
Всего: 160



Цитата(just_geek @  27.8.2009,  18:33 Найти цитируемый пост)
А на каких строках падало в обоих случаях? Такое ощущение, что либо память портишь сам. Либо вызываешь функцию не созданного класса. 

Падает он на:
Код

molecule_->addAtom(chemistryAtom);

а там собственно:
Код

void Chemistry::Molecule::addAtom(const Chemistry::Atom& atom)
{
  atoms_.append(atom);
}



--------------------
PM MAIL WWW GTalk Jabber   Вверх
just_geek
Дата 27.8.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: 7
Всего: 10



Код

molecule_->addAtom(chemistryAtom);

ну и чему в этом месте равно значение указателя?

molecue_ то к этому моменту создано?
PM MAIL   Вверх
kemiisto
Дата 27.8.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 8
Всего: 160



Цитата(just_geek @  27.8.2009,  18:46 Найти цитируемый пост)
ну и чему в этом месте равно значение указателя?

user posted image


--------------------
PM MAIL WWW GTalk Jabber   Вверх
just_geek
Дата 27.8.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: 7
Всего: 10



гхм

а если дальше внутрь функции 
Код

molecule_->addAtom(chemistryAtom); // пытаемся добавить


пройти ? может где то внутри падает?
PM MAIL   Вверх
kemiisto
Дата 27.8.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 8
Всего: 160



just_geek, да там код то одна строчка:
Код

void Chemistry::Molecule::addAtom(const Chemistry::Atom& atom)
{
  atoms_.append(atom);
}

Падает при добавлении элемента. Если в debug'е - то останавливается на:
Код

    inline bool operator!=(int value) const
    {
        return _q_value != value;
    }

из qbasicatomic.h.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
kemiisto
  Дата 28.8.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 8
Всего: 160



Пытался менять QList на QVector, std::list, std::vector. Никакой разницы. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
andrew_121
Дата 28.8.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



пересобири Qt(единственное что на ум пришло).


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
kemiisto
  Дата 28.8.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 8
Всего: 160



andrew_121, я уж на 3 разных сборках тестил на 3-х разных ОС'ях. Не работает. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
fearuth
Дата 28.8.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 9.9.2008

Репутация: нет
Всего: 1



Попробуй atoms_.append(atom) заменить на:

Код

atoms_<<atom;

PM MAIL   Вверх
kemiisto
Дата 28.8.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 8
Всего: 160



fearuth, пробовал уже. Это одно и тоже. И результат такой же.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1351 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.