201: Ошибка Проверки диапазона - Pascal
Формулировка задачи:
Дарова Всем)
Столкнулся с теоретически невозможной ошибкой (!=) округления Real-дробного числа
на таком участке кода:
где эти переменные объявлены как:
Ошибка происходит на участке
И описыается справкой как:
Склоняюсь к третьему варианту. Но не представляю, что нужно сделать Real`у чтобы он вышел за границы
Вступление:
Пишу Игру.
X1,Y1 и X2,Y2 = это реальные координаты объекта в игре
DrwX1,DrwY1 и DrwX2,DrwY2 = это округленные те же координаты, только округленные.
Используются как параметры для отрисовки объекта на экране.
Реальные координаты (X1,Y1 и X2,Y2) раз в 100мс меняются на значение скорости.
Иксы - смещаются на горизонтальную скорость hspeed,
Игреки - на вертикальную скорость vspeed
Чтобы Объект на своем пути сталкивался с другими объектами, а не перскакивал сразу через 24 пикселя -
Я ввел код Пошагового Передвижения.
После такого перемещения рассчитываются новые координаты(DrwX1,DrwY1 и DrwX2,DrwY2) в которых будет отрисован объект.
Всё)) Спасибо Всем Кто ПрочитаЛ)))
Для любознательных привожу Исходник Системы Передвижения))
Если будут вопросы -пишите в личку
Поки)
drwX1:=round(X1); drwX2:=round(X2);
drwY1:=round(Y1); drwY2:=round(Y2);var X1,Y1,X2,Y2: Real; drwX1,drwY1,drwX2,drwY2:Integer;
{
} drwX1:=round(X1); drwX2:=round(X2);
drwY1:=round(Y1); drwY2:=round(Y2); {
при попытке округлить X1:real до Integer`а }>> 201: Ошибка Проверки диапазона >> 201: Range Check Error Являющаяся ошибкой во время выполнения. Появляется в случаях когда 1) Индекс Массива вне диапазона 2) Назначение Переменной значения вне её диапазона 3) Передача Функции значения вне её диапазона
var
hspeed, vspeed:Real;
...
X1:=X1 + hspeed; X2:= X2 + hspeed;
Y1:=Y1 - vspeed; Y2:= Y2 - vspeed; stp_count:= MaxInt( Ceil_Round(abs(hspeed)) , Ceil_Round(abs(vspeed)) );
if (stp_count=0) then
h_chg:=hspeed/stp_count;
v_chg:=vspeed/stp_count;
{FOR}
for stp:=1 to stp_count do begin
If not Collision_Place
(Objects.pointer[obj], X1+h_chg,Y1+v_chg,X2+h_chg,Y2+v_chg, [PhT_Solid], DefNeighbors)
then begin
X1:=X1 + h_chg;
X2:=X2 + h_chg;
Y1:=Y1 + v_chg;
Y2:=Y2 + v_chg;
end else break;
end; {step by step FOR ends}----------------------------------------------------------
Всё! Есть))) Нашел ошибку!))) Кусок Призрак попался))) Я его вам выделил как красную строку:{stp_count:= MaxInt( Ceil_Round(abs(hspeed)) , Ceil_Round(abs(vspeed)) );}
'if (stp_count=0) then'
h_chg:=hspeed/stp_count;
v_chg:=vspeed/stp_count;
{FOR}
for stp:=1 to stp_count do begin
If not Collision_Place
(Objects.pointer[obj], X1+h_chg,Y1+v_chg,X2+h_chg,Y2+v_chg, [PhT_Solid], DefNeighbors)
then begin
X1:=X1 + h_chg;
X2:=X2 + h_chg;
Y1:=Y1 + v_chg;
Y2:=Y2 + v_chg;
end else break;
end; {step by step FOR ends} for obj:=1 to Objects.count do
with (Objects.pointer[obj]^) do begin
{ MOVING }
{ PLAN }
{save pos}
{move}
{check}
{collide}
{replace}
{step by step}
{ PLAN ENDS }
stp_count:= MaxInt( Ceil_Round(abs(hspeed)) , Ceil_Round(abs(vspeed)) );
If stp_count=0 then continue;
{save pos}
X1prev:=X1;
X2prev:=X2;
Y1prev:=Y1;
Y2prev:=Y2;
{move} {}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}
X1:=X1 + hspeed; X2:= X2 + hspeed;
Y1:=Y1 - vspeed; Y2:= Y2 - vspeed;
{check}
if Collision_Place(Objects.pointer[obj],X1,Y1,X2,Y2,[PhT_solid],DefNeighbors) then begin
{collide with Every Neighbour}
for col_i:=1 to Objects.Count do if (col_i in DefNeighbors) then
Collide_objects(Objects.pointer[obj],Objects.pointer[col_i]);
{replace} {to a Start Position}
X1:=X1prev;
X2:=X2prev;
Y1:=Y1prev;
Y2:=Y2prev;
{step by step}
{stp_count:= MaxInt( Ceil_Round(abs(hspeed)) , Ceil_Round(abs(vspeed)) );}
{ if (stp_count<>0) then begin}
h_chg:=hspeed/stp_count;
v_chg:=vspeed/stp_count;
{FOR}
for stp:=1 to stp_count do begin
If not Collision_Place
(Objects.pointer[obj], X1+h_chg,Y1+v_chg,X2+h_chg,Y2+v_chg, [PhT_Solid], DefNeighbors)
then begin
X1:=X1 + h_chg;
X2:=X2 + h_chg;
Y1:=Y1 + v_chg;
Y2:=Y2 + v_chg;
end else break;
end; {step by step FOR ends}
end; {IF collision ends}
{draw}
drwX1:=round(X1); drwX2:=round(X2);
drwY1:=round(Y1); drwY2:=round(Y2);
...
end; {WITH ends}----------------------------------------------------------
Щас еще скольжение Тела вдоль Соседних физических объектов при невозможности переместится на их положение пропишу)) Вообще класс будет =)) А Потом Экзешку выложу))) Отпразднуем!)))Решение задачи: «201: Ошибка Проверки диапазона»
textual
Листинг программы
Program aaaaa;
{$R-}
var .....