| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > floating point invalid operation |
| Автор: dimavit 11.8.2012, 10:03 |
| Имитация движения объекта (точка радиусом 3 пиксела) производится следующим образом: пересчитываются его координаты, на месте его текущего положения перерисовывается фон, сохраненный ранее в его свойстве Bmp, объект отрисовывается в точке с новыми координатами. Однако, при этом иногда возникает ошибка: floating point invalid operation вот в этом месте программы: Form1.PaintBox1.Canvas.Draw(X-3, Y-3, Bmp); //восстанавливаем фон, извлекая его из свойства Bmp и помещая в текущее месторасположение объекта С чем может быть связана данная ошибка (повторюсь, что возникает она не всегда)? Необходимо отметить, что количество объектов, которые отрисовываются, увеличивается за счет создания все новых объектов в цикле. И кроме вышеуказанной ошибки возникает также и другая (а именно project raised exception class EOutOfResources with message 'Out of system resources') в момент отрисовки объекта: Form1.PaintBox1.Canvas.Pen.Color := clRed; Form1.PaintBox1.Canvas.Brush.Color: =clRed; Form1.PaintBox1.Canvas.Ellipse(X-3, Y-3, X+3, Y+3); |
| Автор: dimavit 12.8.2012, 09:02 |
| Со второй проблемой, похоже, справиться удалось, а вот с первой - никак. Call Stack показывает ошибку здесь: :0040493b @ROUND +$3. Что бы это могло значить? |
| Автор: Illusion Dolphin 12.8.2012, 09:52 | ||||
| И что же было во 2м случае не так? Может поделитесь? По поводу 1го случая: Меня смущает что
вместе с
Как бы там round и нету. Значит надо выложить полный Call Stack и по пару строчек до и после Form1.PaintBox1.Canvas.Draw. Иначе это гадание на кофейной гуще (https://www.google.by/search?q=%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0+%D0%B2+17+%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a). |
| Автор: dimavit 15.8.2012, 11:06 | ||||||
И что же было во 2м случае не так? Может поделитесь? Объект имеет следующий алгоритм перемещения: непосредственно перед перемещением объекта на том месте в котором он находится в настоящее время восстанавливается участок канвы, перекрываемый объектом. Этот участок был занесен в свойство BMP объекта во время предыдущего перемещения. Затем делается копирование участка канвы на который будет перемещен объект и заносится в его свойство BMP. После этого объект перерисовывается в новом месте. И так далее в цикле движения. Так вот при занесении скопированного участка в свойство BMP, объект, представляющий из себя это свойство каждый раз создавался заново. Т.е вместо того, чтобы создать его один раз при создании основного объекта, а потом просто обновлять, он создавался каждый раз при каждом новом шаге объекта. Учитывая, что самих объектов много, да еще на каждом шаге каждого объекта создавался новый объект их свойства BMP, очень скоро это количество становилось слишком большим. Form1.PaintBox1.Canvas.Draw(X-3, Y-3, Bmp); Как бы там round и нету. Совершенно верно, round был на предыдущем шаге, а поскольку этот шаг был процедурой, да еще, использовавшей кучу разных условий, то это место ускользало от внимания. Вот там то иногда и возникало деление на 0 при случайном совпадении координат двух объектов. |