Название: Игра Танки. Segmentation error Отправлено: 8Observer8 от Январь 12, 2015, 23:11 Привет
Не могу понять почему происходит ошибка. Запустите, пожалуйста, программу и нажмите "пробел": https://github.com/8Observer8/Tanks Код
Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 12, 2015, 23:32 Ошибка происходит на строке из кода выше:
Код
Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 10:34 Там такая ситуация: когда я нажимаю на пробел, выполняется секция case Qt::Key_Space в этой функции:
Код
Запускается таймер m_projectileTimer.start( 20 ); Каждые 20 милисекунд вызывается функция: void Scene::slotOfMovingOfProjectiles() Крэш происходит когда сняряд подлетает к стенке и должен взорваться. Это происходит, когда Y-координата снаряда меньше или равна нулю. Тогда вызывается функция: addProjectileExplosion( x0, y0 ); которой передаётся положение снаряда. Эта функция должна показать анимацию взрыва: Код
Ошибка происходит при создании объекта: "ExplosionOfTank *explosion = new" Точнее, на строке m_textures.push_back Код
Не могу понять в чём ошибка. Почему "segmentation error"? Название: Re: Segmentation error Отправлено: Igors от Январь 13, 2015, 10:54 Для начала перед строкой вылета вставить
Код
Потом открыть букварь и прочитать Цитировать This does create the underlying OpenGL texture object. Therefore, construction using this constructor does require a valid current OpenGL context. И убедиться что контекст создан и установлен. Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 11:06 Добавил и получил:
Цитировать QImage(null) QImage(null) Сначала обрадовался, так как у видел, что пропустил букву "s" в слове Texture, исправил: Код
Теперь выводится: Код
Самое обидное, что крэш так и истался на: Код
Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 11:08 Потом открыть букварь и прочитать Цитировать This does create the underlying OpenGL texture object. Therefore, construction using this constructor does require a valid current OpenGL context. И убедиться что контекст создан и установлен. Вот это самое непонятное. Дело в том, что танк создаётся абсолютно также, как снаряд. Никакой разницы между классами. С танком прокатывает, а со снарядом нет. Так не должно быть Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 11:16 Единственная разница - объект класса Tank создаётся в initializeGL(), а объект класса ExplosionOfProjectile в слоте
Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 11:19 Я добавил makeCurrent()\doneCurrent(), но всё равно не помогло:
Код
Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 11:32 Как передать контекст?
Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 12:09 Ошибка не при создании объекта. Я ставлю точку останова на update() и программа останавливается, но потом если продолжить, то происходит крэш:
Код
Название: Re: Segmentation error Отправлено: Igors от Январь 13, 2015, 12:15 Выложите проект zip'ом, если соберется (Вындоуз, GL 3.3) - посмотрю
Название: Re: Segmentation error Отправлено: m_ax от Январь 13, 2015, 12:17 Не, ну вы же пишите статьи по "современным контейнерам", а тут недоумеваете:
Код
Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 12:18 Выложите проект zip'ом, если соберется (Вындоуз, GL 3.3) - посмотрю Вот здесь (https://github.com/8Observer8/Tanks) справа кнопка "Donwload ZIP"Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 12:19 Не, ну вы же пишите статьи по "современным контейнерам", а тут недоумеваете: Здесь всё нормально теперь. Там проблема была - ошибка в пути. Теперь этот момент проходит. Я выше написалКод
Название: Re: Segmentation error Отправлено: m_ax от Январь 13, 2015, 12:20 Цитировать Здесь всё нормально теперь. Там проблема была - ошибка в пути. Теперь этот момент проходит. Я выше написал Эх.. Ничего вы не поняли(Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 12:24 Цитировать Здесь всё нормально теперь. Там проблема была - ошибка в пути. Теперь этот момент проходит. Я выше написал Эх.. Ничего вы не поняли(Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 13:52 Не, ну вы же пишите статьи по "современным контейнерам", а тут недоумеваете: Подскажите, пожалуйста, что тут не так?Код
Название: Re: Segmentation error Отправлено: Igors от Январь 13, 2015, 14:02 На Вындоуз не пошло (нужен 5.4), а на Mac у меня вылет в др месте. Была такая конструкция
Код Если erase, то итератор становится невалидным, напр ++ с ним уже нельзя. Как с auto - не читал, но наверное тоже, т.к. здесь вылетала. Я сделал по-старинке (измененный файл в аттаче), вылета нет Код Кстати как то же с auto? Название: Re: Segmentation error Отправлено: m_ax от Январь 13, 2015, 14:26 Цитировать Подскажите, пожалуйста, что тут не так? Что по вашему происходит с вектором, когда вы делаете push_back ? Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 14:55 Если erase, то итератор становится невалидным, напр ++ с ним уже нельзя. Как с auto - не читал, но наверное тоже, т.к. здесь вылетала. Я сделал по-старинке (измененный файл в аттаче), вылета нет Огромное спасибо! Второй день страдал. Это страшно, когда кажется, что уже никогда её не найдёшь. Я поделюсь кодом игры, когда закончу первый уровень и приведу код в порядок. Как вас отблагодарить? Может пару сотен кинуть на телефон или webmoney? Нормально? Напишите в личку. Не хочу оставаться в долгу. Вы даже не представляете, как вы меня сильно выручилиКстати, можно написать: Код
Вместо: Код
Цитировать Подскажите, пожалуйста, что тут не так? Что по вашему происходит с вектором, когда вы делаете push_back ? Название: Re: Segmentation error Отправлено: Igors от Январь 13, 2015, 15:09 Что по вашему происходит с вектором, когда вы делаете push_back ? Что-то слишком тонкие намеки :) Ну да, перераспределит память, но хранятся-то указатели, поэтому здесь это ничем не чревато.Как вас отблагодарить? Не писать поверхностных, непродуманных статей :)И кстати: если addProjectileExplosion( x0, y0 ) добавляет в мапу (не вижу но в принципе возможно), то вылета не будет, но не все эл-ты будут проитерированы (некоторые новые могут быть пропущены) Название: Re: Segmentation error Отправлено: 8Observer8 от Январь 13, 2015, 18:29 И кстати: если addProjectileExplosion( x0, y0 ) добавляет в мапу (не вижу но в принципе возможно), то вылета не будет, но не все эл-ты будут проитерированы (некоторые новые могут быть пропущены) Я пока не понял, почему могут быть пропущены Вот здесь (http://www.qtcentre.org/threads/61325-Segmentation-error?p=271383#post271383) ответили что: Цитировать Correct would be to use the return value of erase() as the new iterOfProjectile. Подумаю над этим на досуге Добавлю пока стенок и сделаю, чтобы можно было взорвать второй танк Ещё у меня проблемы со звуком. Я хотел сделать отдельный класс SoundOfShot наследником QRunnable и в переопределённом методе run() запускать звуковой эффект выстрела (m_sound это объект класса QSoundEffect): Код
Объект класса SoundOfShot хотел создавать при нажатии на пробел: Код
А перед этим в конструкторе: Код
Идея со звуком и потоками правильная? Название: Re: Segmentation error Отправлено: Igors от Январь 14, 2015, 08:50 Вот здесь (http://www.qtcentre.org/threads/61325-Segmentation-error?p=271383#post271383) ответили что: Это предполагает QMap (а там std::map). Впрочем и с QMap цикл for не годитсяЦитировать Correct would be to use the return value of erase() as the new iterOfProjectile. Ещё у меня проблемы со звуком. Я хотел сделать отдельный класс SoundOfShot наследником QRunnable и в переопределённом методе run() запускать звуковой эффект выстрела (m_sound это объект класса QSoundEffect): Ну такой run точно неверный, не может класс быть сделан так глупо что его надо так ждать. Что произойдет если, не мудрствуя лукаво, просто вызвать play в главной нитке? Может он асинхронный, и проблемы никакой нет. Для начала проверьтеКод ... Идея со звуком и потоками правильная? |