Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Может ли std::vector быть членом класса? и как его инициализировать 
:(
    Опции темы
Чупакабро
Дата 27.9.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(feodorv @  27.9.2012,  09:54 Найти цитируемый пост)
Нет, ну а там инициализации разные, в том числе и separatingAxis?

Вот! тут, я думаю, корень зол! Но как инициализировать, не знаю!
Пробовал так:
Код

mesh->separatingAxis = VertexVector();

но вылетает...
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
feodorv
Дата 27.9.2012, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Чупакабро @  27.9.2012,  10:56 Найти цитируемый пост)
Но как инициализировать, не знаю!

Цитата(mes @  27.9.2012,  10:54 Найти цитируемый пост)
new в помощь.. 

В любом случае Вам нужно вызвать конструктор для вектора...

Это сообщение отредактировал(а) feodorv - 27.9.2012, 10:00


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот - mesh у меня нормально инициализирован. Но если я нажму F10, то произойдет вылет
user posted image

Добавлено через 3 минуты и 37 секунд
Вот ошипка:
user posted image

Добавлено через 14 минут и 57 секунд
Друзья!
Методом научного втыка я решил проблему:
Код

    VertexVector* separatingAxis;
......
     mesh->separatingAxis = new VertexVector();

Всем спасибо за советы!
Видимо я и создатели STL друг друга немного недопоняли))
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
mes
Дата 27.9.2012, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата

mesh->separatingAxis = VertexVector ();

нелегально, если separatingAxis не создан.. см. выше.. 


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Оператор присваивания не есть инициализация (это не C). Конструктор для separatingAxis должен быть вызван до оператора =, который здесь означает copy vector content:
Цитата

The elements contained in the vector object before the call are dropped

А дропать у Вас можно только мусор, присутствующий в separatingAxis...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



да конструктор вот он: VertexVector ()
Но в общем, я решил проблему, см. выше
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
feodorv
Дата 27.9.2012, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Чупакабро @  27.9.2012,  11:24 Найти цитируемый пост)
да конструктор вот он: VertexVector ()

Это вызов конструктор другого экземпляра VertexVector, не separatingAxis.

Цитата(Чупакабро @  27.9.2012,  11:03 Найти цитируемый пост)
Видимо я и создатели STL друг друга немного недопоняли))

STL тут совсем не причём. А вот ООП - очень даже)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



VertexVector это имя типа
typedef std::vector<XMFLOAT33> VertexVector;
с таким же успехом можно написать 
 mesh->separatingAxis= std::vector<XMFLOAT33>();

Это сообщение отредактировал(а) Чупакабро - 27.9.2012, 10:33
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
mes
Дата 27.9.2012, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(Чупакабро @  27.9.2012,  09:32 Найти цитируемый пост)
с таким же успехом можно написать 
 mesh->separatingAxis= std::vector<XMFLOAT33>();

успехов в многочасовой отладке неуловимых багов  smile раз мимо ушей пропускаете то, что Вам советуют.. 


--------------------
PM MAIL WWW   Вверх
Чупакабро
Дата 27.9.2012, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(feodorv @  27.9.2012,  09:58 Найти цитируемый пост)
В любом случае Вам нужно вызвать конструктор для вектора

вроде же прислушался к совету))
Ну и собственно, у меня все заработало.
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
bsa
Дата 27.9.2012, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Чупакабро, ты видимо так и не понимаешь. Основная проблема в том, что ты выделяешь память с помощью realloc для массива объектов типа Mesh. А Mesh с вектором не является POD (plain old data) типом. Т.е. его, например, нельзя тупо копировать. Поэтому, забудь о реаллок и маллок. Тебе необходимо использовать new[], а лучше векторы и списки.
В целом, прежде чем что-то писать рекомендую почитать книжки.
PM   Вверх
mes
Дата 27.9.2012, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(Чупакабро @  27.9.2012,  10:10 Найти цитируемый пост)

вроде же прислушался к совету))

Цитата(mes @  27.9.2012,  09:19 Найти цитируемый пост)
нелегально, если separatingAxis не создан.. см. выше..  





--------------------
PM MAIL WWW   Вверх
Чупакабро
Дата 27.9.2012, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Mesh это просто структура, не класс.
Потом вектор в меше я заменил на указатель на вектор.
Соответсвенно, Mesh так и осталась структурой фиксированного размера.
А маллоки я заменю на new, да.

Цитата(bsa @  27.9.2012,  11:17 Найти цитируемый пост)
А Mesh с вектором не является POD (plain old data) типом

Вот про это в тех книжках, которые я читаю, не написано... Я думал, что вектор вставляется туда изначально в виде указателя

Это сообщение отредактировал(а) Чупакабро - 27.9.2012, 11:27
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Dem_max
Дата 27.9.2012, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 4
Всего: 39



Цитата

Потом вектор в меше я заменил на указатель на вектор.

И в итоге у тебя структура стала не POD


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот сначала у меня было, грубо говоря, так:
struct S1
{
  int a;
  std::vector<int> b;
};

Потом стало так:
struct S1
{
  int a;
  void* b;
}; - разве это не POD?

В общем, есть неочевидные моменты, которые не во всех книгах расписаны. Поэтому и спрашиваю здесь))



Это сообщение отредактировал(а) Чупакабро - 27.9.2012, 11:46
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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