Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/113: Рейтинг темы: голосов - 113, средняя оценка - 4.61
 Аватар для Moonlight Inc.
18 / 18 / 9
Регистрация: 07.10.2008
Сообщений: 89

201: Ошибка Проверки диапазона

22.03.2010, 08:12. Показов 20712. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дарова Всем)

Столкнулся с теоретически невозможной ошибкой (!=) округления Real-дробного числа
на таком участке кода:

Pascal
1
2
         drwX1:=round(X1); drwX2:=round(X2);
         drwY1:=round(Y1); drwY2:=round(Y2);
где эти переменные объявлены как:
Pascal
1
2
3
var
  X1,Y1,X2,Y2: Real;
  drwX1,drwY1,drwX2,drwY2:Integer;

Ошибка происходит на участке
Pascal
1
2
3
4
5
{
 
}        drwX1:=round(X1); drwX2:=round(X2);
         drwY1:=round(Y1); drwY2:=round(Y2); {
при попытке округлить X1:real до Integer`а  }
И описыается справкой как:

Code
1
2
3
4
5
6
7
8
>> 201: Ошибка Проверки диапазона
>> 201: Range Check Error
 
Являющаяся ошибкой во время выполнения.
Появляется в случаях когда
1) Индекс Массива вне диапазона
2) Назначение Переменной значения вне её диапазона
3) Передача Функции значения вне её диапазона
Склоняюсь к третьему варианту. Но не представляю, что нужно сделать Real`у чтобы он вышел за границы

Вступление:
Пишу Игру.
X1,Y1 и X2,Y2 = это реальные координаты объекта в игре
DrwX1,DrwY1 и DrwX2,DrwY2 = это округленные те же координаты, только округленные.
Используются как параметры для отрисовки объекта на экране.


Реальные координаты (X1,Y1 и X2,Y2) раз в 100мс меняются на значение скорости.
Иксы - смещаются на горизонтальную скорость hspeed,
Игреки - на вертикальную скорость vspeed

Pascal
1
2
3
4
5
6
var
    hspeed, vspeed:Real;
...
 
     X1:=X1 + hspeed; X2:= X2 + hspeed;
     Y1:=Y1 - vspeed; Y2:= Y2 - vspeed;

Чтобы Объект на своем пути сталкивался с другими объектами, а не перскакивал сразу через 24 пикселя -
Я ввел код Пошагового Передвижения.


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                           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}

После такого перемещения рассчитываются новые координаты(DrwX1,DrwY1 и DrwX2,DrwY2) в которых будет отрисован объект.

Добавлено через 8 минут
----------------------------------------------------------
Всё! Есть)))
Нашел ошибку!)))


Кусок Призрак попался)))
Я его вам выделил как красную строку:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{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}

Всё)) Спасибо Всем Кто ПрочитаЛ)))
Для любознательных привожу Исходник Системы Передвижения))

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 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}
Если будут вопросы -пишите в личку
Поки)

----------------------------------------------------------
Щас еще скольжение Тела вдоль Соседних физических объектов при невозможности переместится на их положение пропишу))

Вообще класс будет =))


А Потом Экзешку выложу)))
Отпразднуем!)))
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.03.2010, 08:12
Ответы с готовыми решениями:

Ошибка проверки диапазона при работе с типизированным типом файла
Возникает ошибка проверки диапазона? как это исправить? program Lab8; uses crt; type Pol = (man,woman); Tperson...

Выдает ошибку проверки диапазона
Выдает ошибку проверки диапазона. Поможете исправить? Program otchot3; type z=record fio:array of char; g,g1:integer; ...

Ошибка 201, проверьте, пожалйста
Здравствуйте, уважаемые форумчане. Подскажите, паскаль выбрасывает 201 ошибку. program poop; var a, b, s: string; i:...

3
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
22.03.2010, 09:01
Moonlight Inc., В таких случаях, особено при работе в графическом режиме помогает отключение опции проверки диапазона, просто в большой программе бывает трудно найти этот глюк. Просто пишете
Pascal
1
2
3
Program aaaaa;
{$R-}
var .....
1
 Аватар для Moonlight Inc.
18 / 18 / 9
Регистрация: 07.10.2008
Сообщений: 89
22.03.2010, 16:54  [ТС]
Puporev, Пасибо, я видел в справке, пытался уже))

Прикол в том, что {$R-} = это значение по умолчанию))
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
22.03.2010, 17:12
Цитата Сообщение от Moonlight Inc. Посмотреть сообщение
это значение по умолчанию))
Это уж как в опциях компилятора поставишь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2010, 17:12
Помогаю со студенческими работами здесь

Турбо Паскаль ошибка 201
Ребят, помогите. Я работаю в Турбо Паскале (первый раз, до этого пользовалась АВС Паскалем), в общем.. написала программу, компиляция...

Не могу найти ошибку, ошибка выполнения 201
Мне нужно было перевести задачу с фортрана на паскаль, в итоге получилось это, но с ошибкой, которую я не могу найти. Может кто-то увидит? ...

Ошибка 201 или как запустить TP7.0 на Win7
Доброго времени суток! Есть программа на TP: Program Space; Uses Graph, Crt,Dos; const centrx=300; centry=160; ...

Ошибка при проверке диапазона
Program p1; var a:array of integer; x,y,m,i:integer; begin writeln('введите колличество чисел, но не болше 100') readln(m); ...

Ошибка 0 - выход за границы диапазона изменения индекса
program masiv; var i, j, n, sum: integer; mas: array of integer; begin writeln('введите масив: '); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru