![]() |
|
Модераторы: bsa |
![]()
|
|
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Внутри класса объявил вектор, а при попытке что-то сделать с этим вектором программа вылетает
--------------------
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. |
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
А можно код хотя бы?
-------------------- ![]() |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Вот:
--------------------
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. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| rodnover |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
А где
создается?
|
||||
|
|||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Да создается все, чесслово:
Это сообщение отредактировал(а) Чупакабро - 27.9.2012, 09:38 --------------------
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. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Крайне сомнительная строчка. При dwVertexCount, равном 1, будет деление на ноль. Это сообщение отредактировал(а) feodorv - 27.9.2012, 09:39 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Скорее всего выход за границы массивов.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
feodorv это оффтоп... там не может быть значение меньше 3. а по теме подсказать можете?
--------------------
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. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Это юмор? Вы проверяли? Вот. Понавставляйте проверок разных, будет Вам счастье. А точку кода, на которой программа рушится, Вы определили? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
блин, вот
могу всю функцию запостить, там 100500 строк) да создется mesh, там со всеми другими мемберами все в порядке, значения присваиваются. Добавлено @ 09:49 feodorv, вылет происходит вот именно на этой строчке: mesh->separatingAxis.resize(1); а по поводу dwVertexCount - это число вершин в многоугольнике. которое не может быть меньше 3. ну, по хорошему надо проверку поставить... Добавлено @ 09:52 косяк именно с std::vector, только вот в чем он заключается, не пойму... Это сообщение отредактировал(а) Чупакабро - 27.9.2012, 09:54 --------------------
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. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Нет, ну а там инициализации разные, в том числе и separatingAxis? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Вот же подсказывают:
Ну или массив этих мешей... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Чупакабро |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Вот! тут, я думаю, корень зол! Но как инициализировать, не знаю! Пробовал так:
но вылетает... --------------------
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. |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
В любом случае Вам нужно вызвать конструктор для вектора... Это сообщение отредактировал(а) feodorv - 27.9.2012, 10:00 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Вот - mesh у меня нормально инициализирован. Но если я нажму F10, то произойдет вылет
![]() Добавлено через 3 минуты и 37 секунд Вот ошипка: ![]() Добавлено через 14 минут и 57 секунд Друзья! Методом научного втыка я решил проблему:
Всем спасибо за советы! Видимо я и создатели 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. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
нелегально, если separatingAxis не создан.. см. выше.. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Оператор присваивания не есть инициализация (это не C). Конструктор для separatingAxis должен быть вызван до оператора =, который здесь означает copy vector content:
А дропать у Вас можно только мусор, присутствующий в separatingAxis... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Это вызов конструктор другого экземпляра VertexVector, не separatingAxis. STL тут совсем не причём. А вот ООП - очень даже))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
вроде же прислушался к совету)) Ну и собственно, у меня все заработало. --------------------
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. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Чупакабро, ты видимо так и не понимаешь. Основная проблема в том, что ты выделяешь память с помощью realloc для массива объектов типа Mesh. А Mesh с вектором не является POD (plain old data) типом. Т.е. его, например, нельзя тупо копировать. Поэтому, забудь о реаллок и маллок. Тебе необходимо использовать new[], а лучше векторы и списки.
В целом, прежде чем что-то писать рекомендую почитать книжки. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
|
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Mesh это просто структура, не класс.
Потом вектор в меше я заменил на указатель на вектор. Соответсвенно, Mesh так и осталась структурой фиксированного размера. А маллоки я заменю на new, да. Вот про это в тех книжках, которые я читаю, не написано... Я думал, что вектор вставляется туда изначально в виде указателя Это сообщение отредактировал(а) Чупакабро - 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. |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
И в итоге у тебя структура стала не POD -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Если стандартный метод выделения памяти не подходит, то перегрузите оператор new для своего класса и выделяйте в нем память своим способом, при этом будет правильно работать инициализация объектов.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
Надо до этого дорасти)) Начать использовать new вместо malloc. Пойду читать книжки) И с вектором все ж таки разберусь до конца. --------------------
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. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
По моему худший вариант смешивать С и С++ . Это чревато появлением кучи трудноуловимых ошибок. Лучше уж писать на чистом С и проводить все инициализации и перераспределения памяти руками. Т.е. всегда сам следишь за всем. Сам контролируешь время жизни структур данных и последовательность инициализации. Или же совсем забыть про С как про страшный сон и даже перестать использовать указатели в явном виде (Использовать классы, которые сами следят за своей памятью, которую они выделили в куче). -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
лучше заменить ручное распределение памяти на контейнеры:
Это сообщение отредактировал(а) baldina - 27.9.2012, 13:10 |
|||
|
||||
| Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: нет Всего: 4 |
ну вот я начал потихоньку заменять все на контейнеры, поэтому собственно тема и образовалась
--------------------
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. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Чупакабро, начинать надо не изнутри, а снаружи. А по хорошему, почитай хорошую литературу, список приведен в "Ответах на часто задаваемые вопросы" (тема закреплена в разделе).
|
|||
|
||||
| rodnover |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
В С++ структура от класса отличается только тем, что в структуре члены класса по умолчанию публичные, а в классе приватные (если в новом, стандарте, конечно, этого не понимали) Есть такое правило выделять и освобождать память определенным методом. Если в С мы могли выделить память malloc, то и очищать мы его должны родственной функцией (free). Создание классов в С++ намного сложнее. Каждый член класса должен быть проинициализирован (иначе, он будет содержать просто мусор). В итоге, все члены класса (которые тоже может быть классами) запускают свои конструкторы (по просту говоря функции инициализации), которые будут запускать конструкторы и для встроенных членов. и так далее.. Для этого служит оператор new, который помимо выделения памяти еще и производит действия инициализации.. Оператор delete выполняет противоположные обязанности. Сначала производит определенные действия при удалении объекта, а потом очищает память. Все операторы, фактически, являются функциями, начинающимися с [b]operator[b]. в итоге
преобразуется к виду (как примерный показательный вариант)
где функция operator= просто копирует определенным образом объект из второго параметра в объект из первого параметра. Но, если первый параметр был выделене без инициализации (malloc), он будет скопирован в мусор. Поэтому все объекты в С++ надо выделять через оператор new, а удалять через delete. P.S. Для инициализации массивов объектов в С++ существует оператор new[] и обратный оператор delete []
|
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
// удаляем все
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
bsa, baldina, т.е. это
> Mech a* = new Mech[15] вас не смутило? Это сообщение отредактировал(а) borisbn - 29.9.2012, 00:50 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| NoviceF |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: 2 Всего: 2 |
Ну очипятка же.. что вы, право слово! Это сообщение отредактировал(а) NoviceF - 29.9.2012, 13:08 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |