Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переполнение стека 
:(
    Опции темы
makartetsky
Дата 27.2.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет. Такая тема. (Использую рекурсивный растровый алгоритм flood fill.) 
Код

private void Recurs(int x, int y)
      {
          
        if (Quasi.GetPixel(x,y).G > 0 && Quasi.GetPixel(x,y).R == 0 && Quasi.GetPixel(x,y).B == 0)
        { 
            if (Watch[x,y] == 0) Quasi.SetPixel(x,y,Color.Blue);
        }
        else  
        {
          if (x+1<400 && Watch[x+1,y] == 0)  Recurs(x+1,y);
          if (y + 1 < 400 && Watch[x, y+1] == 0) Recurs(x, y + 1);
          if (x - 1 > 0 && Watch[x-1, y] == 0) Recurs(x - 1, y);
          if (y - 1 > 0 && Watch[x, y-1] == 0) Recurs(x, y - 1);
        }
          Watch[x,y] = 1;
      }



На строке         if (Quasi.GetPixel(x,y).G > 0 && Quasi.GetPixel(x,y).R == 0 && Quasi.GetPixel(x,y).B == 0) происходит переполнение стека. Почему, не знаете? 
PM MAIL   Вверх
marcusmae
Дата 27.2.2008, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



makartetsky

Вы используете рекурсию. По всей видимости, превышен максимальный уровень вложенности.

Цитата(makartetsky @  27.2.2008,  20:30 Найти цитируемый пост)
(Quasi.GetPixel(x,y).G > 0 && Quasi.GetPixel(x,y).R == 0 && Quasi.GetPixel(x,y).B == 0)

Не забыли ли Вы тут случайно скобки..?

А вообще с рекурсией надо аккуратнее. Рекурсивные алгоритмы конечно проще составить, но затем лучше преобразовывать в обычные - многие рекурсивные алгоритмы можно переписать без рекурсии.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
makartetsky
Дата 28.2.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Marcusmae, к сожалению, этот алгоритм относится к числу тех, которые нельзя переписать без рекурсии. 
Что касается скобок - то нет, вроде не забыл. 
Может можно как то увеличить размер стека?
PM MAIL   Вверх
marcusmae
Дата 28.2.2008, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата(makartetsky @  28.2.2008,  00:00 Найти цитируемый пост)
Может можно как то увеличить размер стека?


Забудьте об этом.

Цитата(makartetsky @  28.2.2008,  00:00 Найти цитируемый пост)
Что касается скобок - то нет, вроде не забыл. 


Для начало давайте в этом убедимся. Если что, логическое && имеет больший приоритет, чем неравенства. То есть скобки могли бы стоять так :

Код

((Quasi.GetPixel(x,y).G > 0) && (Quasi.GetPixel(x,y).R == 0) && (Quasi.GetPixel(x,y).B == 0))


Нет?

Цитата(makartetsky @  28.2.2008,  00:00 Найти цитируемый пост)
к сожалению, этот алгоритм относится к числу тех, которые нельзя переписать без рекурсии


Дааа? = Что-то я в этом сильно сомневаюсь! Распространяющийся из точки крестик ... над этим лучше подумать завтра, но предполагаю, что всё же он развёртывается в прямые циклы. Но ессесно это будет слегка другой алгоритм.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
makartetsky
Дата 28.2.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



smile
Насчет скобок. Всегда писал подобные условия без внутренних скобок - работало как надо. На досуге надо будет убедиться в этом путем побора примера. 

Цитата

Распространяющийся из точки крестик ... 


Прошу заметить, не просто распространяющийся из точки крестик, а крестик, обходящий контуры, присутствующие на рисунке.
 
А почему надо забыть про увеличение стека?
PM MAIL   Вверх
marcusmae
Дата 28.2.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата(makartetsky @  28.2.2008,  00:37 Найти цитируемый пост)
А почему надо забыть про увеличение стека?


Потому что не делают так. Вам никакого стека не хватит.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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