Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблема с порядком вызова процедур


Автор: AntonPavlov 14.9.2011, 19:11
Нужно написать программу, вычерчивающую график астроиды. Вот, собственно код:

Код

var
 cx,cy:integer;
 dX,dY:real;

function TfrmGraph.X1(b,alpha:real):real;
begin
 X1:=b*(cos(alpha/4)*cos(alpha/4)*cos(alpha/4));
end;

function TfrmGraph.Y1(b,alpha:real):real;
begin
 Y1:=b*(sin(alpha/4)*sin(alpha/4)*sin(alpha/4));
end;

procedure TfrmGraph.Astroid;
const Step = 0.01;
var XX,YY,x,y:real;
 a,b:real;
 alpha:real;
 k:real;
begin
 a:=0;
 b:=1440/180*pi;
 alpha:=a;
 XX:=Abs(X1(k,a));
 YY := Abs(Y1(k,a));
 alpha:=a;
 repeat
 if YY < Abs(Y1(k,alpha)) then YY := Abs(Y1(k,alpha));
 alpha:=alpha+0.01;
 until alpha>=b;
 dX := imgGraph.Height/2.2 / XX;
 dY := imgGraph.Width/2.2 / YY;
 alpha:=a;
 y := Y1(k,alpha);
 x := X1(k,alpha);
 imgGraph.Canvas.MoveTo(cx + Round(dX * x ),cy - Round(dY * y ));
 alpha:=a+0.01;
 imgGraph.Canvas.Pen.Color:=clGreen;
 imgGraph.Canvas.Pen.Width:=3;
 Repeat
 y := Y1(k,alpha);
 x := X1(k,alpha);
 imgGraph.Canvas.Lineto(Round(cx + (dX * x )), Round(cy - (dY * y )));
 alpha := alpha + 0.01;
 Until alpha > b;
end;

procedure TfrmGraph.CoordGrid;
begin
 imgGraph.Canvas.Pen.Width:=1;
 imgGraph.Canvas.Pen.Color:=clRed;
 imgGraph.Canvas.MoveTo(0,cx);
 imgGraph.Canvas.LineTo(imgGraph.Width,cx);
 imgGraph.Canvas.MoveTo(cy,0);
 imgGraph.Canvas.LineTo(cy,imgGraph.Height);
 imgGraph.Canvas.Font.Size:=8;
 imgGraph.Canvas.Font.Style:=[fsBold];
 imgGraph.Canvas.Brush.Color:=clWhite;
 imgGraph.Canvas.TextOut(485,cy-30,'X');
 imgGraph.Canvas.TextOut(cx-25,5,'Y');
 imgGraph.Canvas.Brush.Color:=clBlack;
end;

procedure TfrmGraph.FormCreate(Sender: TObject);
begin
 cx:=round(imgGraph.Width/2);
 cy:=round(imgGraph.Height/2);
 Astroid;
 CoordGrid;
end;
end.


Проблема в том, что если в FormCreate первой вызывать процедуру рисования осей - CoordGrid, а потом уже выводить график - то возникает ошибка Floating Point Overflow. Никак не могу понять, в чем же дело....подскажите, а?

Автор: Snowy 14.9.2011, 19:58
Проблема не в очередности, а в том, что у тебя k не инициализирована.
Просто при разном порядке функций значение у нее разное, что вызывает разные ошибки, либо не вызывает...
Вобщем поведение программы будет непредсказуемо, если использовать переменные, значение которых явно не определено.

Добавлено через 1 минуту и 1 секунду
Зато alpha:=a; у тебя аж 2 раза

Автор: AntonPavlov 14.9.2011, 20:24
аааа, точно, спасибо! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)