Помощь - Поиск - Пользователи - Календарь
Полная версия: Нарисовать график функции
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Relrin
Взяв код из форума, решил нарисовать график функции вида: cos(x)/(x+2), однако возникает постоянно ошибка 216

Uses Graph,crt;
const
{ OPTIONS }
shag=0.0001;
lgr = -50;
pgr = 50;
zcrtX=320;
zcrty=240;
mtrX=10;
mtrY=10;
colorG=15;
colorOXY=4;
OXYminX=-200;
OXYmaxX=200;
OXYminY=-200;
oxymaxY=200;

Var grDriver : Integer;
grMode : Integer;

x,y:real;{extended;}
i:integer;
Begin
grDriver:=Detect;
InitGraph(grDriver, grMode, '');
for i:=OXYminX to OXYmaxX do putpixel(zcrtX+i,zcrty,colorOXY);
for i:=OXYminY to OXYmaxY do putpixel(zcrtX,zcrty-i,colorOXY);

x:=lgr;
while x<=pgr do
begin
if x<>1 then
begin y:=сos(x)/(x+2);
writeln(y:1:8);
putpixel(zcrtx+trunc(x*mtrX),zcrty-trunc(y*mtrY),colorg)
end;
x:=x+shag;
end;
readkey;
closegraph;
end.
klem4
Паскаля под рукой нету, проверить не могу, проверь, не получается ли у тебя отрицательных значений в аргументах putpixel, инициализируется ли вообще граф режим, нету ли деления на 0, например тут: y:=сos(x)/(x+2);
volvo
Ошибка будет еще до деления, когда при приближении X к (-2) значение Y начнет резко возрастать. Как только zcrtx+trunc(x*mtrX) или zcrty-trunc(y*mtrY) перестанет помещаться в Integer (ну, в этом случае, естественно, второй вариант) - программа вылетит...

Как проверить: описываешь переменную b : boolean, присваиваешь ей значение False, и делаешь вот так:
     b := b or (zcrtx+round(x*mtrX) = 300);
if b then
begin
writeln(' x = ', x:10:6, ' y = ', y:10:6, zcrtx+round(x*mtrX):10,zcrty-round(y*mtrY):10);
end;

putpixel(zcrtx+round(x*mtrX),zcrty-round(y*mtrY),colorg)

, а то ждать полчаса будешь, пока дойдешь до ошибки...

Вот кусок того, что непосредственно предшествует вылету:
 x =  -2.000900 y = 463.294760       300     -4393
x = -2.000800 y = 521.093025 300 -4971
x = -2.000700 y = 595.405088 300 -5714
x = -2.000600 y = 694.487854 300 -6705
x = -2.000500 y = 833.203759 300 -8092
x = -2.000400 y = 1041.277701 300 -10173
x = -2.000300 y = 1388.067838 300 -13641
x = -2.000200 y = 2081.649020 300 -20576
x = -2.000100 y = 4162.399968 300 -41384
No heap dump by heaptrc unit
Exitcode = 201
Runtime error 201 at $00401A1C

Relrin
Цитата(volvo @ 23.03.2011 20:00) *

Ошибка будет еще до деления, когда при приближении X к (-2) значение Y начнет резко возрастать. Как только zcrtx+trunc(x*mtrX) или zcrty-trunc(y*mtrY) перестанет помещаться в Integer (ну, в этом случае, естественно, второй вариант) - программа вылетит...

Как проверить: описываем переменную b : boolean, присваиваешь ей значение False, и делаешь вот так:
     b := b or (zcrtx+round(x*mtrX) = 300);
if b then
begin
writeln(' x = ', x:10:6, ' y = ', y:10:6, zcrtx+round(x*mtrX):10,zcrty-round(y*mtrY):10);
end;

putpixel(zcrtx+round(x*mtrX),zcrty-round(y*mtrY),colorg)

, а то ждать полчаса будешь, пока дойдешь до ошибки...

Вот кусок того, что непосредственно предшествует вылету:
 x =  -2.000900 y = 463.294760       300     -4393
x = -2.000800 y = 521.093025 300 -4971
x = -2.000700 y = 595.405088 300 -5714
x = -2.000600 y = 694.487854 300 -6705
x = -2.000500 y = 833.203759 300 -8092
x = -2.000400 y = 1041.277701 300 -10173
x = -2.000300 y = 1388.067838 300 -13641
x = -2.000200 y = 2081.649020 300 -20576
x = -2.000100 y = 4162.399968 300 -41384
No heap dump by heaptrc unit
Exitcode = 201
Runtime error 201 at $00401A1C



Ок. Спасибо, буду разбираться дальше ;)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.