![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Дима |
|
|||
|
Unregistered |
Хочу написать функцию заливки области - рекурсивно проверяется цвет точки
и если не совпадает то меняется и переход к соседям. Мой код работает только для трех соседей и заполняет половину а если добавляю четвертого то все падает.Помогите понять что тут не то.Заранее спасибо. void CExView::OnLButtonDown(UINT nFlags, CPoint point) { Fill(point.x,point.y); } void CExView::Fill(int x,int y) { CClientDC dc(this); if( color != dc.GetPixel(x,y)) { dc.SetPixel(x,y,color); Fill(x,y-1); Fill(x+1,y); Fill(x,y+1); Fill(x-1,y); } } |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Во-первых у тебя процесс уходит в бесконечность по всем направлениям если попадается не замкнутая область. Во-вторых color - видимо, глобальная переменная, и не понятно, где и чем она инициализируется и что да как, ты либо пиши всё, либо внеси её в аргументы (оно вернее будет)
|
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
А, кстати, ты еще DC при рисовании каждой точки заново получаешь. Это не есть хорошо потому что прежде, чем захватывать его заново, надо бы его освободить, так что либо делай передачу DC внутри рекурсии (оно будет вернее и гораздо быстрее, чем захват каждый раз заново), либо отпускай DC прежде, чем произвести рекурсивный вызов.
|
|||
|
||||
| Дима |
|
|||
|
Unregistered |
Насчет бесконечности - просто добавил проверку.
Передача DC как аргумента - не помогает. А где и как ты предлагаешь его закрывать? |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Проверку там просто так не сделаешь потому что если ты проверяешь на отрицательные и слишком большие значения, то это - не гарантия. Можно изменять точку отсчета в dc.
Насчет передачи dc - нужно например в функции заливки его открыть, вызвать оттуда другую функцию - рекурсивную, по выходу из неё dc отпустить. А ты смотрел, какая именно у тебя ошибка выскакивает? Где программа циклится или вылетает? |
|||
|
||||
| Дима |
|
|||
|
Unregistered |
Мой код работает только для трех функций и заполняет половину а если добавляю четвертою то все падает.
|
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Эээ... дык ведь деструктор вызывается ж... а в деструкторе у него релиз есть... -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Деструктор не вызывается потому что вызов рекурсии происходит до выхода из поля видимости локального объекта, деструктор будет вызываться уже после возврата из всего дерева рекурсии. По крайней мере если оптимизация компилятора не намудрит чего ни будь, но обычно в этой области она не мудрит.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |