IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Нарисовать график функции, Ошибка 216
Relrin
сообщение 23.03.2011 17:58
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 64
Пол: Мужской

Репутация: -  0  +


Взяв код из форума, решил нарисовать график функции вида: 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Relrin
сообщение 23.03.2011 19:08
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 64
Пол: Мужской

Репутация: -  0  +


Цитата(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



Ок. Спасибо, буду разбираться дальше ;)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 22:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"