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 .....
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д