Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2009, 19:06   #1
Dead Guy Doo
 
Регистрация: 25.02.2009
Сообщений: 3
По умолчанию ATL(Help)

Пишу компонент-визуализатор задачи про Ханойские башни.
Кто не знает,читаем здесь:http://ru.wikipedia.org/wiki/Ханойская_башня
Вот рекурсивное решение:

Код:
void CTow::Move(int n, int source, int dest,int help)
{
	if(n==1)
	{
		
		tower[dest][nb[dest]+1]=tower[source][nb[source]];
		nb[dest]++;
		nb[source]--;
		Invalidate();//вызывает отрисовку колец
		SleepEx(delay,TRUE);
		
	}
	else
	{
		Move(n-1, source, help, dest);
		Move(1,source,dest,help);
		Move(n-1,help,dest,source);
	}
}

Соответственно,открываем Шарп или Дельфи,кидаем на новую форму готовый компонент,на вкладке Properties вводим свойства number и delay,
нажимаем на кнопку,которая вызывает метод:
Код:
STDMETHODIMP CTow::Start(void)
{
	nb[0]=number-1;
	nb[1]=-1;
	nb[2]=-1;

	for(int i=0;i<number;i++)
	{
	tower[0][number-1-i]=i*5+5;

	tower[1][number-1-i]=0;
	tower[2][number-1-i]=0;
	}

	started=true;//нужно для начала отрисовки
	Invalidate();


	Move(number,0,2,1);

	return S_OK;
}
---
И все хорошо бы,но программа дожна рисовать пошагово как нужно перекидывать кольца,через время задержки,а у меня она рисует только конечный результат,через суммарное время заддержки.
--
Насколько я понял проблема в том,что рекурсия забивает стэк,и Invalidate(),остается в конце стэка(то есть в начале..ну вообщем,самым нижним в стопке) поэтому когда выполняется сама отрисовка,параметры уже просчитаны для уже решенной задачи.
Кто знает как с этим бороться?

Модератор: тег CODE

Последний раз редактировалось MaTBeu; 25.02.2009 в 19:28.
Dead Guy Doo вне форума Ответить с цитированием
Старый 25.02.2009, 19:36   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Попробуйте вот так
Код:
void CTow::Move(int n, int source, int dest,int help)
{
	if(n==1)
	{
		
		tower[dest][nb[dest]+1]=tower[source][nb[source]];
		nb[dest]++;
		nb[source]--;
		//Invalidate();//вызывает отрисовку колец
		SleepEx(delay,TRUE);
		
	}
	else
	{
                       Invalidate();
		Move(n-1, source, help, dest);
		Move(1,source,dest,help);
		Move(n-1,help,dest,source);
	}
}
MaTBeu вне форума Ответить с цитированием
Старый 25.02.2009, 19:54   #3
Dead Guy Doo
 
Регистрация: 25.02.2009
Сообщений: 3
По умолчанию

MaTBeu,спасибо,но не помогло(
Если,вдруг,проблема заинтересовала или знаете еще способы,могу кинуть ссылку на исходники библиотеки.
Dead Guy Doo вне форума Ответить с цитированием
Старый 25.02.2009, 22:11   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Попробуйте посовать функцию Invalidate между рекурсивными вызовами процедур. Должно помочь.
MaTBeu вне форума Ответить с цитированием
Старый 26.02.2009, 17:26   #5
Dead Guy Doo
 
Регистрация: 25.02.2009
Сообщений: 3
По умолчанию

Уже пробовал,не поможет.Если бы можно было вместо инвалидэйта саму отрисовку,тогда помогло бы,а так нет.
Dead Guy Doo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
visual c++ 2008 и ATL vvviperrr Свободное общение 2 18.06.2008 17:15