Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 7 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 25.06.2009
Откуда: Краснодар
Всем привет! Есть программа, рисующая дерево с использованием рекурсии. Хочу сделать, чтобы можно было изменять скорость рисования дерева, для этого пытаюсь использовать процедуру sleep. Но проблема в том, что при использовании sleep при выполнении программы происходит перезаполнения стека, без этой процедуры все нормально. Подскажите, как можно исправить проблему?
Код программы:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ColorGrd;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ColorDialog1: TColorDialog;
    Button2: TButton;
    Edit1: TEdit;
    UpDown1: TUpDown;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure Tree(
  Canvas: TCanvas; //Canvas, íà êîòîðîì áóäåò ðèñîâàòüñÿ äåðåâî
  x,y: extended; //Êîîðäèíàòû êîðíÿ
  Angle: extended; //Óãîë, ïîä êîòîðûì ðàñòåò äåðåâî
  TrunkLength: extended; //Äëèíà ñòâîëà
  n: integer //Êîëè÷åñòâî ðàçâåòâëåíèé (ñêîëüêî åùå ïðåäñòîèò
             //ðåêóðñèâíûõ âûçîâîâ)

);
var
  x2, y2: extended; //Êîíåö ñòâîëà (òî÷êà ðàçâåòâëåíèÿ)
  spd: integer;

begin

     x2 := x + TrunkLength * cos(Angle);
     y2 := y - TrunkLength * sin(Angle);

     Canvas.MoveTo(round(x), round(y));
     Canvas.LineTo(round(x2), round(y2));

     if n > 1 then
     spd:=StrToint (form1.Edit2.Text);
      sleep (250);
     begin
       Tree(Canvas, x2, y2, Angle+Pi/4, 0.55*TrunkLength, n-1);
       Tree(Canvas, x2, y2, Angle-Pi/4, 0.55*TrunkLength, n-1);

     end;
end;
procedure TForm1.Button1Click(Sender: TObject);

var
w:integer;

begin

w:=strtoint (Edit1.Text);
canvas.fillrect(canvas.cliprect); //Î÷èñòêà õîëñòà

form1.Canvas.Pen.Color:=ColorDialog1.Color ;
form1.Canvas.Pen.Width:=w ;
Tree(Form1.Canvas, 175, 280, Pi/2, 120, 15);


end;

procedure TForm1.Button2Click(Sender: TObject);
var
 cl: TColorDialog;

begin
if ColorDialog1.Execute then
end;


end.

_________________
☠[OVER]GOODWIN☠



Партнер
 

Member
Статус: Не в сети
Регистрация: 24.05.2009
Поставить правильно begin и end, относящиеся к условию "if n > 1 then". Сейчас получается бесконечная рекурсия из-за того, что условие относиться только к одной строке сразу под ним.


 

Member
Статус: Не в сети
Регистрация: 25.06.2009
Откуда: Краснодар
Griffen, извиняюсь за тупой вопрос, но правильно это как?

_________________
☠[OVER]GOODWIN☠


 

Member
Статус: Не в сети
Регистрация: 24.05.2009
Begin, который сразу после Sleep'а, перенести на две строки вверх - он должен идти сразу после условия.


 

Member
Статус: Не в сети
Регистрация: 25.06.2009
Откуда: Краснодар
Griffen, сделал как сказали, все равно происходит перезаполнение стека.

_________________
☠[OVER]GOODWIN☠


 

Member
Статус: Не в сети
Регистрация: 24.05.2009
Проверил, и у меня нормально работает. Можно, конечно, увеличить размер памяти под стек в настройках проекта или с помощью директив {$M minstacksize,maxstacksize}, {$MINSTACKSIZE number}, {$MAXSTACKSIZE number}.

Но: зачем так много итераций, если большинство веток дерева получаются меньше одного пиксела? Вместо 15 (2^15 = 32768 итераций) поставить, например, 10-12 (2^10 = 1024 итераций). Это в Button1Click вызов Tree, последний параметр.


 

Member
Статус: Не в сети
Регистрация: 25.06.2009
Откуда: Краснодар
Griffen, изменил число итераций. и все заработало без ошибок! Большое спасибо, сам бы я не разобрался в этом.

_________________
☠[OVER]GOODWIN☠


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 7 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  

Лаборатория














Новости

Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan