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

22.03.2010, 08:12. Показов 20037. Ответов 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`а  }

И описыается справкой как:

Код

>> 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



I did some searching saying it’s about storing a value where it doesn’t fit but I don’t how it happened in my code. I checked my code a bunch of times but I’m still getting this. I did some searching saying it’s about storing a value where it doesn’t fit but I don’t how it happened in my code. I checked my code a bunch of times but I’m still getting this.

program ACT2;

uses crt;

var
    inputs : array[1..5] of integer;
    index1 : integer;
    choice : char;
    toPrint : integer;

function getSUM(var inputArray : array of integer) : integer;
var
    SUM, sumIndex : integer;

begin  
    SUM := 0;
    sumIndex := 1;

    repeat
    SUM := SUM + inputArray[sumIndex];
    sumIndex := sumIndex + 1;
    until (sumIndex > 5);

    getSUM := SUM;
end;


begin

clrscr;

    for index1 := 1 to 5 do
    begin
        write('Input Integer[', index1); write(']: ');
        readln(inputs[index1]);
    end;

clrscr;

write('Integers:');

for index1 := 1 to 5 do
begin
    write('  ', inputs[index1]);
end;

writeln(''); writeln(''); writeln('');

writeln('[1]  SUM');
writeln('[2]  AVERAGE');

writeln('');

write('INPUT: ');

readln(choice);


if(choice = '1') then
    toPrint := getSUM(inputs);

writeln(toPrint);
readkey;
end.

asked Oct 11, 2017 at 16:36

Kyle Oliva's user avatar

3

The other two answers have correctly identified the cause of your problem, which is that you are using two different array types with different bases, 1 versus 0.

However, you could have avoided this problem in the first place by declaring your own integer array type and then using it consistently,
as in

type
  TInputArray = array[1..5] of Integer;
var
    inputs : TInputArray; //array[1..5] of integer;
    index1 : integer;
    choice : char;
    toPrint : integer;

//function getSUM(var inputArray : array of integer) : integer;
function getSUM(var inputArray : TInputArray) : integer;
var
    SUM, sumIndex : integer;

begin

    SUM := 0;
    sumIndex := Low(inputArray);

    repeat
      SUM := SUM + inputArray[sumIndex];
      sumIndex := sumIndex + 1;
    until (sumIndex > High(inputArray));

    getSUM := SUM;
end;

Notice that the integer 5 only occurs once in this version of the program, and the use of the standard Low and High functions means that there is only one place that 5 needs to be changed if you want to alter the size of the array. In fact, it might be better to define the number of elements as a constant and use the constant in the array declaration, as in

const NumOfElements = 5;
type
  TInputArray = array[1..NumOfElements] of Integer;

answered Oct 11, 2017 at 17:54

MartynA's user avatar

MartynAMartynA

30.4k4 gold badges31 silver badges72 bronze badges

0

In the function statement

function getSUM(var inputArray : array of integer) : integer;

the inputArray is on open array (see the FPC reference manual 14.4.5, Open array parameters). The index bounds are 0 to 4, better
use low(inputArray) and high(inputArray). In your repeat loop you use
inputArray[5], where index 5 is out of range.

answered Oct 11, 2017 at 17:41

gammatester's user avatar

gammatestergammatester

1,1311 gold badge8 silver badges12 bronze badges

You are making a mistake in your function GetSum.

The argument var inputArray : array of integer is an open array that is indexed from zero.

See Run-time errors:

201 Range check error

If you compiled your program with range checking on, then you can get this error in the following cases:

* An array was accessed with an index outside its declared range.
* Trying to assign a value to a variable outside its range (for instance an enumerated type).

Here you are using an index outside of the declared range.

Make your loop something like this:

for sumIndex := 0 to High(inputArray) do ...

That will make the function generic, independent of the array size.

Community's user avatar

answered Oct 11, 2017 at 17:41

LU RD's user avatar

LU RDLU RD

34.4k5 gold badges88 silver badges295 bronze badges

Дарова Всем)

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

         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) Передача Функции значения вне её диапазона

Склоняюсь к третьему варианту. Но не представляю, что нужно сделать Real`у чтобы он вышел за границы

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

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

var
    hspeed, vspeed:Real;
...
 
     X1:=X1 + hspeed; X2:= X2 + hspeed;
     Y1:=Y1 - vspeed; Y2:= Y2 - vspeed;

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

                           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) в которых будет отрисован объект.

———————————————————-

Всё! Есть)))
Нашел ошибку!)))

Кусок Призрак попался)))
Я его вам выделил как красную строку:

{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: Ошибка Проверки диапазона»

22.03.2010, 08:12. Показов 19735. Ответов 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`а  }

И описыается справкой как:

Код

>> 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

Умея
пользоваться массивами, условными
операторами и операторами цикла, вы
можете писать довольно серьезные
программы. При выполнении этих программ
неизбежно будут возникать критические
ошибки, приводящие к аварийному завершению
программы. Такие ошибки по английски
называются Run-time errors — ошибки времени
выполнения. Рассмотрим пока только
наиболее часто встречающиеся арифметические
ошибки:

Division
by zero — код ошибки 200;

Arithmetic
overflow — код ошибки 215;

Range
check error — код ошибки 201;

Floating
point overflow — код ошибки 205;

Invalid
floating point operation — код ошибки 207.

Ошибка
Division
by zero

— деление на ноль — возникает при выполнении
операций DIV,
MOD

и /,
когда делитель равен нулю.

Ошибка
Arithmetic overflow

— целочисленное переполнение — возникает
при выполнении арифметической операции
над целыми числами, когда результат
операции выходит за границы соответствующего
типа. Такая ошибка произойдет, например,
при выполнении программы

VAR
a,b : Word; c : Integer; BEGIN a:=100; b:=200; c:=a-b; END.

Ошибка
произошла, когда вычислилось значение
выражения a-b,
равное -100.
Мы знаем, что при выполнении операции
над операндами типа Word
результат будет иметь тип Word,
а -100 не является допустимым значением
этого типа. То обстоятельство, что это
значение мы собирались присвоить
переменной типа Integer,
не
имеет значения, т.к. ошибка произошла
до
присваивания. Интересно, что, если
описать a
и
b

как
Byte
,
то ошибки не будет (см. таблицу 2 в главе
5).

Ошибка
Range
check error

— ошибка проверки диапазона — происходит
в двух случаях. Во-первых, при попытке
присвоить целочисленной переменной
недопустимое значение, и, во-вторых, при
использовании недопустимого индексного
выражения для элемента любого массива.
Проиллюстрируем оба эти случая на
простых примерах.

VAR
a,b,c : Word; BEGIN a:=$FFFF; b:=1; c:=a+b; END.

Мы
попытались присвоить переменной типа
Word
значение 65536, которое не является
допустимым для этого типа.

VAR
x : ARRAY[2..8] OF Real; i : Byte;

BEGIN
FOR i:=8 DOWNTO 1 DO x[i]:=Sqrt(i); END.

Ошибка
произошла при обращении к первому
элементу массива, который не существует.
Фактически этот второй случай полностью
аналогичен первому — мы попытались
«присвоить» индексу массива, тип
которого-2..8, значение 1.

Ошибка
Floating
point overflow

— вещественное переполнение — возникает
при выполнении операции над вещественными
числами, когда результат операции
слишком велик, или при попытке присвоить
вещественной переменной слишком большое
значение. Когда речь идет о вещественных
числах, термин «слишком большое»
следует понимать как большое по абсолютной
величине — знак числа не имеет значения.
Приведем пример программы, содержащей
такую ошибку.

VAR
r : Real; BEGIN r:=-1E20; r:=Sqr(r); END.

При
возведении в квадрат величины r
мы получим слишком большое для типа
Real
число
1E40.

Ошибка
Invalid
floating point operation

возникает в трех случаях:

1)
при вычислении корня из отрицательного
числа;

2)
при вычислении логарифма неположительного
числа;

3)
при вычислении функций Trunc и Round от
слишком большого (по абсолютной величине)
вещественного числа. Эта ошибка довольно
очевидна, и мы не станем ее иллюстрировать.

Как
же должен поступать программист, когда
при выполнении его программы возникают
ошибки? Прежде всего нужно локализовать
ошибку, то есть найти оператор, в котором
она произошла. В этом вам может помочь
среда Turbo Pascal, если в ней правильно
установлены опции
компилятора
.
Опции компилятора позволяют изменять
режим компиляции и задаются в подменю
Compiler
меню Options
среды Turbo Pascal. Пока нас будут интересовать
лишь пять опций: Range
checking
,
Stack
cheking
,
I/O
checking
,
Overflow
checking
,
Debug
information.
Если они включены, то настройка среды
благоприятна для отладки вашей программы.
Если они выключены, то их обязательно
следует включить, а еще лучше задать их
непосредственно в тексте своей программы.
Опции записываются в программе в виде:

{$
буква
+
/
}

Каждой
опции соответствует своя буква (эти
буквы выделены в подменю Compiler
цветом), символ «+» означает включить,
а символ «-» — выключить. В программе
можно задать одну опцию, например, {$R+}
или несколько опций — {$R+,I-,S+}
. Некоторые опции можно записывать
только в самом начале программы, другие
могут размещаться в любом ее месте.

Опция
Range
checking

(R) отвечает за контроль ошибок Range
check error
,
Overflow
checking

(C) — за контроль ошибок Ariphmetic
overflow
,
I/O
cheking

(I) — за контроль ошибок ввода-вывода.
Смысл опции Stack
cheking

(S) будет объяснен несколько позже, а
опция Debug
information

(D) включает в код программы отладочную
информацию, что позволяет среде Turbo
Pascal при аварийном завершении программы
показать курсором оператор, в котором
произошла ошибка. Позаботьтесь, чтобы
при отладке программы перед первым ее
оператором была строка {$R+,C+,I+,S+,D+}
— это поможет вам найти и устранить все
ошибки. Некоторые неопытные программисты
выключают эти опции, тогда программа
не прерывается при некоторых ошибках,
а продолжает выполняться, на этом
основании делается вывод, что программа
верна. Это самообман — программа
выполняется, но выполняется неправильно
и никак не сообщает об ошибках.

Соседние файлы в папке Учебники

  • #
  • #

Я пытаюсь преобразовать этот код C ++ в Pascal, но я получаю ошибку 201. Может кто-нибудь помочь мне исправить это?

Код C ++:

int n;
bool a[100];

void show()
{
for (int i=1; i<=n; i++)
if (a[i])
printf("%d ", i);
printf("n");
}

void bt(int u)
{
if (u==n+1)
{
show();
return ;
}
a[u]=0;
bt(u+1);
a[u]=1;
bt(u+1);
}

main()
{
scanf("%d", &n);
bt(1);
}

Паскаль код:

type data = integer; var i,n:integer; a:array[0..100] of integer; b:array[0..100] of integer;

procedure show; var i:data; begin
for i:=1 to n do
begin
if (b[i]=0) then
writeln(a[i]);
end; end;

procedure bt(i:data); var u:data; begin

if (u=n+1) then
begin
show();
end
else
b[u]:=0;
bt(u+1);
b[u]:=1;
bt(u+1);

end;

begin
write('Nhap n ');
readln(n);
bt(1); end.

Спасибо, и извините за мой уровень английского

1

Решение

Мой c ++ немного ржавый, но это не похоже на точный перевод для меня. Попробуйте что-то вроде этого:

type
data = integer;

var
// i,
n : integer;
a : array[0..100] of boolean; // integer;
//  b : array[0..100] of integer;

procedure SetUp;
var
i : Integer;
begin
for i := 0 to 100 do
a[i] := True;
end;

procedure show;
var
i : data;
begin
for i := 1 to n do
begin
if a[i] then
write(i);
end;
writeln;
end;

procedure bt(i : data);
var
u : data;
begin
if ( u = n + 1) then
begin
show();
end;
///  else
//    b[u] := False;
bt(u + 1);
a[u] := True;
bt(u+1);
end;

begin
SetUp;
write('Nhap n ');
readln(n);
bt(1);
readln;
end.

Паскаль имеет родной логический тип, поэтому я изменил объявление массива a. Я включил подпрограмму SetUp для явной инициализации. Я не уверен, откуда твой массив b.

Кстати, если SetUp устанавливает значения элементов a в false, все, что вы получите, — это серия пустых строк.

1

Другие решения

Как можно более точное преобразование будет:

program StackOverflow1;

{$APPTYPE CONSOLE}

var
n: Integer;
a: array[0..99] of Boolean;

procedure show;
var
i: Integer;
begin
for i := 1 to n do       // This is very suspicious!
if a[i] then
Write(i, ' ');
Writeln;
end;

procedure bt(u: Integer);
begin
if u = n + 1 then
begin
Show;
Exit;
end;
a[u] := False;
bt(u + 1);
a[u] := True;
bt(u + 1);
end;

begin
Writeln('enter n:');
Readln(n);
bt(1);
end.

Линия

for i := 1 to n do     // for (int i=1; i<=n; i++)

выглядит так, как будто это должно было быть

for i := 0 to n - 1 do // for (int i=0; i<n; i++)

C не имеет проверки диапазона, поэтому он не дает вам ошибки. Но ваш Паскаль имеет, и этот цикл, вероятно, поэтому вы получаете ошибку времени выполнения 201.

Я не знаю, что должна делать эта программа, но меня не удивило бы, если бы программа на C не дала правильный результат.

Также меня не удивит, если для значений n близко к 99, вы получите ошибку переполнения стека (или эквивалентный номер времени выполнения). Если пользователь вводит значения для n > 99это, вероятно, приведет к ошибке проверки диапазона, если ошибка переполнения стека не возникнет первой.

Я пробовал с n = 80и это заняло целую вечность, поэтому я Ctrl+С‘редактировать.


В качестве альтернативы, вы можете использовать

  a: array[1..100] of Boolean;

но это не соответствует программе на Си. В C все массивы начинаются с нуля. Если оригинальная программа на C работает правильно, то мой перевод на Паскаль также должен.

1

Hello I have been given the task of reading file input of 3 digit month abbreviations and a day and I must calculate the Julian date for each (sum of days since jan 1)
No matter what I do when I add two INTEGERS I get error 201 (incompatible data types). I have tried making a new program and gotten it to work but once I implement it into my existing code it doesn’t work anymore. This is very frustrating, please help. I’m sick of this stupid class making me take this language where I can’t find shit online to help.
Here is the code:

program prg6_150;
const
      MONABV:array[1..12] of string[03] = ('JAN','FEB','MAR','APR','MAY','JUN',
                                           'JUL','AUG','SEP','OCT','NOV','DEC');
      MONDAYS:array[1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);

var
      more_rec:Boolean;                    { EOF flag }
      DAY:integer;                         { input day }
      MONTH:string[03];                    { input month abbreviation }
      JULIAN:integer;                      { computed Julian day }
      ch:char;                             { spacer character for input }
      FileIn:Text;
      FileOut:Text;

{ your module, to be called "JULIAN_DAY" inserted here }


    procedure JULIAN_DAY;
    var
    j,sum_days:integer;
    begin
    j := 0;
    sum_days := 0;
    if MONTH = 'JAN' then j := 1 else
    if MONTH = 'FEB' then j := 2 else
    if MONTH = 'MAR' then j := 3 else
    if MONTH = 'APR' then j := 4 else
    if MONTH = 'MAY' then j := 5 else
    if MONTH = 'JUN' then j := 6 else
    if MONTH = 'JUL' then j := 7 else
    if MONTH = 'AUG' then j := 8 else
    if MONTH = 'SEP' then j := 9 else
    if MONTH = 'OCT' then j := 10 else
    if MONTH = 'NOV' then j := 11 else
    if MONTH = 'DEC' then j := 12; 
    for J:= 2 to 12 do
    repeat
        sum_days := MONDAYS[1] + sum_days;
        j := j - 1
    until j = 1;
    Julian := DAY + sum_days;
    end;

    procedure read_rec;
    begin
      if Eof(FileIn) then
        more_rec := False
      else
        readln(FileIn,day,ch,month)
    end;  { read_rec }

    procedure initialize;
    begin
      more_rec := True;
      Assign(FileIn,'JULIAN.DAT');
      Reset(FileIn);
      Assign(FileOut,'JULIAN.OUT');
      Rewrite(FileOut);
      read_rec
    end;  { initialize }

    procedure process;
    begin
      Julian_Day;
      writeln(FileOut,day:2,' ',month,' ',julian:3);
      read_rec
    end;  { process }

    procedure wrapup;
    begin
      Close(FileOut);
      Close(FileIn)
    end;  { wrapup }

    begin  { main }
      initialize;
      while more_rec do
        process;
      wrapup
    end.

Command Prompt Error

Hello I have been given the task of reading file input of 3 digit month abbreviations and a day and I must calculate the Julian date for each (sum of days since jan 1)
No matter what I do when I add two INTEGERS I get error 201 (incompatible data types). I have tried making a new program and gotten it to work but once I implement it into my existing code it doesn’t work anymore. This is very frustrating, please help. I’m sick of this stupid class making me take this language where I can’t find shit online to help.
Here is the code:

program prg6_150;
const
      MONABV:array[1..12] of string[03] = ('JAN','FEB','MAR','APR','MAY','JUN',
                                           'JUL','AUG','SEP','OCT','NOV','DEC');
      MONDAYS:array[1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);

var
      more_rec:Boolean;                    { EOF flag }
      DAY:integer;                         { input day }
      MONTH:string[03];                    { input month abbreviation }
      JULIAN:integer;                      { computed Julian day }
      ch:char;                             { spacer character for input }
      FileIn:Text;
      FileOut:Text;

{ your module, to be called "JULIAN_DAY" inserted here }


    procedure JULIAN_DAY;
    var
    j,sum_days:integer;
    begin
    j := 0;
    sum_days := 0;
    if MONTH = 'JAN' then j := 1 else
    if MONTH = 'FEB' then j := 2 else
    if MONTH = 'MAR' then j := 3 else
    if MONTH = 'APR' then j := 4 else
    if MONTH = 'MAY' then j := 5 else
    if MONTH = 'JUN' then j := 6 else
    if MONTH = 'JUL' then j := 7 else
    if MONTH = 'AUG' then j := 8 else
    if MONTH = 'SEP' then j := 9 else
    if MONTH = 'OCT' then j := 10 else
    if MONTH = 'NOV' then j := 11 else
    if MONTH = 'DEC' then j := 12; 
    for J:= 2 to 12 do
    repeat
        sum_days := MONDAYS[1] + sum_days;
        j := j - 1
    until j = 1;
    Julian := DAY + sum_days;
    end;

    procedure read_rec;
    begin
      if Eof(FileIn) then
        more_rec := False
      else
        readln(FileIn,day,ch,month)
    end;  { read_rec }

    procedure initialize;
    begin
      more_rec := True;
      Assign(FileIn,'JULIAN.DAT');
      Reset(FileIn);
      Assign(FileOut,'JULIAN.OUT');
      Rewrite(FileOut);
      read_rec
    end;  { initialize }

    procedure process;
    begin
      Julian_Day;
      writeln(FileOut,day:2,' ',month,' ',julian:3);
      read_rec
    end;  { process }

    procedure wrapup;
    begin
      Close(FileOut);
      Close(FileIn)
    end;  { wrapup }

    begin  { main }
      initialize;
      while more_rec do
        process;
      wrapup
    end.

Command Prompt Error

Maxizar писал(а):1- Используйте Lazarus.

Если уметь патчить паскалевское иде, то для многих целей оно не хуже.

2- Забудьте про атавизмы (Goto, Uses Graph, Crt). Не ну правда это даже смешно:

Лучше несколько Goto чем один указатель — структуру программы не разрушает, багов сверх меры не создаёт. Инициализация Crt весит намного меньше Sysutils, а для хелловорда от них требуется лишь Delay или Sleep. Sysutils лишь не устраивает некритичного бага при Writeln(‘русский текст в Utf8 кодировке’); Другие преимущества нужно искать с микроскопом. Sdl работает намного стабильнее Graph и в линуксе и в виндовсе, но не имеет процедур типа Line, Cirkle — того что нужно для построения графиков.

4- Я переписал программу, и она полностью работает, так в чем проблема?

Ага, работает, скомпиленная лично вами, под вайном. Лазарус 0.9.28.2 beta под линуксом не желает её компилить — отсутствует модуль Graph. Имхо, только по этой причине прогамму ещё не разложили по полочкам.

из-за чего приходится проходить весь код… у вас код 100 строк.. и пару циклов….. Дебаггер в руки и вперед.

Какой тут ещё дебаггер? При условии компиляции и запуска, здесь и без него просто ищется. Воткнуть

Код: Выделить всё
A:=A div(A-A);

скомпилировать, запустить, посмотреть вывод, перенести вставку в другое место, скомпилить… И так до обнаружения проблемного оператора.

А автору программы можно посоветовать пореже использовать integer если нет уверенности насчёт ошибки переполнения — int64 наше всё.

Добавлено спустя 1 час 13 минут 11 секунд:
Да, вспомнил, при низкоуровневом рисовании нужно проверять координаты рисуемых точек на диапазон. Если рисовать за пределами окна, то может случиться страшное — что-то типа ошибки 201.

Я немного искал, говоря, что речь идет о хранении значения там, где оно не подходит, но я не понимаю, как это произошло в моем коде. Я проверил свой код несколько раз, но я все еще получаю это. Я немного искал, говоря, что речь идет о хранении значения там, где оно не подходит, но я не понимаю, как это произошло в моем коде. Я проверил свой код несколько раз, но я все еще получаю это.

program ACT2;

uses crt;

var
    inputs : array[1..5] of integer;
    index1 : integer;
    choice : char;
    toPrint : integer;

function getSUM(var inputArray : array of integer) : integer;
var
    SUM, sumIndex : integer;

begin  
    SUM := 0;
    sumIndex := 1;

    repeat
    SUM := SUM + inputArray[sumIndex];
    sumIndex := sumIndex + 1;
    until (sumIndex > 5);

    getSUM := SUM;
end;


begin

clrscr;

    for index1 := 1 to 5 do
    begin
        write('Input Integer[', index1); write(']: ');
        readln(inputs[index1]);
    end;

clrscr;

write('Integers:');

for index1 := 1 to 5 do
begin
    write('  ', inputs[index1]);
end;

writeln(''); writeln(''); writeln('');

writeln('[1]  SUM');
writeln('[2]  AVERAGE');

writeln('');

write('INPUT: ');

readln(choice);


if(choice = '1') then
    toPrint := getSUM(inputs);

writeln(toPrint);
readkey;
end.

3 ответа

Лучший ответ

Два других ответа правильно определили причину вашей проблемы, которая заключается в том, что вы используете два разных типа массива с разными основаниями, 1 против 0.

Тем не менее, вы могли бы избежать этой проблемы в первую очередь, объявив свой собственный тип целочисленного массива, а затем использовать его последовательно, как в

type
  TInputArray = array[1..5] of Integer;
var
    inputs : TInputArray; //array[1..5] of integer;
    index1 : integer;
    choice : char;
    toPrint : integer;

//function getSUM(var inputArray : array of integer) : integer;
function getSUM(var inputArray : TInputArray) : integer;
var
    SUM, sumIndex : integer;

begin

    SUM := 0;
    sumIndex := Low(inputArray);

    repeat
      SUM := SUM + inputArray[sumIndex];
      sumIndex := sumIndex + 1;
    until (sumIndex > High(inputArray));

    getSUM := SUM;
end;

Обратите внимание, что целое число 5 встречается только один раз в этой версии программы, а использование стандартных функций Low и High означает, что есть только одно место, которое 5 необходимо изменить если вы хотите изменить размер массива. На самом деле, было бы лучше определить количество элементов как константу и использовать константу в объявлении массива, как в

const NumOfElements = 5;
type
  TInputArray = array[1..NumOfElements] of Integer;


2

MartynA
12 Окт 2017 в 17:38

Вы делаете ошибку в своей функции GetSum.

Аргумент var inputArray : array of integer является открытым массивом, который проиндексирован с нуля.

См. Ошибки времени выполнения:

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

Если вы скомпилировали свою программу с проверкой диапазона, вы можете получить эту ошибку в следующих случаях:

* An array was accessed with an index outside its declared range.
* Trying to assign a value to a variable outside its range (for instance an enumerated type).

Здесь вы используете индекс за пределами заявленного диапазона.

Сделайте ваш цикл примерно так:

for sumIndex := 0 to High(inputArray) do ...

Это сделает функцию общей, независимой от размера массива.


2

Community
20 Июн 2020 в 09:12

В операторе функции

function getSUM(var inputArray : array of integer) : integer;

InputArray находится в открытом массиве (см. справочное руководство по FPC 14.4.5, Параметры открытого массива). Границы индекса от 0 до 4, лучше используйте low(inputArray) и high(inputArray). В вашем цикле повторения вы используете inputArray [5], где индекс 5 находится вне диапазона.


2

gammatester
11 Окт 2017 в 17:47

I have tried to make a simple snake game with Free Pascal, when I started the programme, it drew the map exactly what I want but after that, I pressed the button that I have set to control the snake and it exited with exit code 201.

I don’t know much about that exit code, could you explain me the problems of the programme? This is the longest program I have ever made with Pascal.

Here is the code:

    uses crt;

    type 
      ran=record
        x:byte;
        y:byte;
      end;

    var 
      f:ran;
      s:array[1..1000] of ran;
      i,j:longint;
      st,l:byte;

    function getkey:integer;
    var 
      k:integer;
    begin
      k:=ord(readkey);
      if k=0 then k:=-ord(readkey);
      getkey:=k;
    end;

    procedure fa;
    begin
      randomize;
      f.x:=random(98)+1;
      f.y:=random(23)+1;
      gotoxy(f.x,f.y);
      writeln('o');
    end;

    procedure draw;
    begin
      gotoxy(1,1);
      st:=1;
      for i:=1 to 25 do begin
        for j:=1 to 100 do write('X');
        writeln
      end;
      gotoxy(st+1,st+1);
      for i:=1 to 23 do begin
        for j:=1 to 98 do write(' ');
        gotoxy(st+1,i+2);
      end;
    end;

    procedure sts;
    begin
      s[1].x:=19;
      s[1].y:=6;
      gotoxy(s[1].x,s[1].y);
      writeln('@');
    end;

    procedure fa1;
    begin
      f.x:=29;
      f.y:=5;
      gotoxy(f.x,f.y);
      writeln('o');
    end;

    procedure eat;
    begin
      if (s[1].x=f.x) and (s[1].y=f.y) then begin
        l:=l+1;
        fa;
      end;
    end;

    function die:boolean;
    begin
      die:=false;
      if (s[1].x=1) or (s[1].x=100) or (s[1].y=1) or (s[1].y=25) then 
        die:=true;
      if l>=5 then
        for i:=5 to l do
          if (s[1].x=s[i].x) and (s[1].y=s[i].y) then 
            die:=true;
    end;

    procedure up;
    begin
      for i:=l downto 2 do begin
        s[i].y:=s[i-1].y;
        gotoxy(s[i].x,s[i].y);
        writeln('+');
      end;
      gotoxy(s[l].x,s[l].y+1);
      writeln(' ');
      s[1].y:=s[1].y-1;
      gotoxy(s[1].x,s[1].y);
      writeln('@');
    end;

    procedure down;
    begin
      for i:=l downto 2 do begin
        s[i].y:=s[i-1].y;
        gotoxy(s[i].x,s[i].y);
        writeln('+');
      end;
      gotoxy(s[l].x,s[l].y-1);
      writeln(' ');
      s[1].y:=s[1].y+1;
      gotoxy(s[1].x,s[1].y);
      writeln('@');
    end;

    procedure left;
    begin
      for i:=l downto 2 do begin
        s[i].x:=s[i-1].x;
        gotoxy(s[i].x,s[i].y);
        writeln('+');
      end;
      gotoxy(s[l].x+1,s[l].y);
      writeln(' ');
      s[1].x:=s[1].x-1;
      gotoxy(s[1].x,s[1].y);
      writeln('@');
    end;

    procedure right;
    begin
      for i:=l downto 2 do begin
        s[i].x:=s[i-1].x;
        gotoxy(s[i].x,s[i].y);
        writeln('+');
      end;
      gotoxy(s[l].x-1,s[l].y);
      writeln(' ');
      s[1].x:=s[1].x+1;
      gotoxy(s[1].x,s[1].y);
      writeln('@');
    end;

    procedure auto(k:integer);
    begin
      case k of
        -72:up;
        -80:down;
        -75:left;
        -77:right;
        119:up;
        115:down;
        97:left;
        100:right;
      end;
    end;

    procedure ingame(t:integer);
    var 
      d,e:boolean;
    begin
      repeat
        auto(t);
        d:=die;
        if d=true then exit;
        eat;
      until (keypressed);
      if keypressed then t:=getkey;
      case t of
        -72:up;
        -80:down;
        -75:left;
        -77:right;
        119:up;
        115:down;
         97:left;
        100:right;
      end;
      eat;
      d:=die;
      if d=true then exit;
    end;

    procedure first;
    var
      k:integer;
    begin
      draw;
      fa1;
      sts;
      if keypressed then k:=getkey;
      ingame(k);
    end;

    BEGIN
      clrscr;
      first;
      readln
    END.

Hello I have been given the task of reading file input of 3 digit month abbreviations and a day and I must calculate the Julian date for each (sum of days since jan 1)
No matter what I do when I add two INTEGERS I get error 201 (incompatible data types). I have tried making a new program and gotten it to work but once I implement it into my existing code it doesn’t work anymore. This is very frustrating, please help. I’m sick of this stupid class making me take this language where I can’t find shit online to help.
Here is the code:

program prg6_150;
const
      MONABV:array[1..12] of string[03] = ('JAN','FEB','MAR','APR','MAY','JUN',
                                           'JUL','AUG','SEP','OCT','NOV','DEC');
      MONDAYS:array[1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);

var
      more_rec:Boolean;                    { EOF flag }
      DAY:integer;                         { input day }
      MONTH:string[03];                    { input month abbreviation }
      JULIAN:integer;                      { computed Julian day }
      ch:char;                             { spacer character for input }
      FileIn:Text;
      FileOut:Text;

{ your module, to be called "JULIAN_DAY" inserted here }


    procedure JULIAN_DAY;
    var
    j,sum_days:integer;
    begin
    j := 0;
    sum_days := 0;
    if MONTH = 'JAN' then j := 1 else
    if MONTH = 'FEB' then j := 2 else
    if MONTH = 'MAR' then j := 3 else
    if MONTH = 'APR' then j := 4 else
    if MONTH = 'MAY' then j := 5 else
    if MONTH = 'JUN' then j := 6 else
    if MONTH = 'JUL' then j := 7 else
    if MONTH = 'AUG' then j := 8 else
    if MONTH = 'SEP' then j := 9 else
    if MONTH = 'OCT' then j := 10 else
    if MONTH = 'NOV' then j := 11 else
    if MONTH = 'DEC' then j := 12; 
    for J:= 2 to 12 do
    repeat
        sum_days := MONDAYS[1] + sum_days;
        j := j - 1
    until j = 1;
    Julian := DAY + sum_days;
    end;

    procedure read_rec;
    begin
      if Eof(FileIn) then
        more_rec := False
      else
        readln(FileIn,day,ch,month)
    end;  { read_rec }

    procedure initialize;
    begin
      more_rec := True;
      Assign(FileIn,'JULIAN.DAT');
      Reset(FileIn);
      Assign(FileOut,'JULIAN.OUT');
      Rewrite(FileOut);
      read_rec
    end;  { initialize }

    procedure process;
    begin
      Julian_Day;
      writeln(FileOut,day:2,' ',month,' ',julian:3);
      read_rec
    end;  { process }

    procedure wrapup;
    begin
      Close(FileOut);
      Close(FileIn)
    end;  { wrapup }

    begin  { main }
      initialize;
      while more_rec do
        process;
      wrapup
    end.

Command Prompt Error

Hello I have been given the task of reading file input of 3 digit month abbreviations and a day and I must calculate the Julian date for each (sum of days since jan 1)
No matter what I do when I add two INTEGERS I get error 201 (incompatible data types). I have tried making a new program and gotten it to work but once I implement it into my existing code it doesn’t work anymore. This is very frustrating, please help. I’m sick of this stupid class making me take this language where I can’t find shit online to help.
Here is the code:

program prg6_150;
const
      MONABV:array[1..12] of string[03] = ('JAN','FEB','MAR','APR','MAY','JUN',
                                           'JUL','AUG','SEP','OCT','NOV','DEC');
      MONDAYS:array[1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);

var
      more_rec:Boolean;                    { EOF flag }
      DAY:integer;                         { input day }
      MONTH:string[03];                    { input month abbreviation }
      JULIAN:integer;                      { computed Julian day }
      ch:char;                             { spacer character for input }
      FileIn:Text;
      FileOut:Text;

{ your module, to be called "JULIAN_DAY" inserted here }


    procedure JULIAN_DAY;
    var
    j,sum_days:integer;
    begin
    j := 0;
    sum_days := 0;
    if MONTH = 'JAN' then j := 1 else
    if MONTH = 'FEB' then j := 2 else
    if MONTH = 'MAR' then j := 3 else
    if MONTH = 'APR' then j := 4 else
    if MONTH = 'MAY' then j := 5 else
    if MONTH = 'JUN' then j := 6 else
    if MONTH = 'JUL' then j := 7 else
    if MONTH = 'AUG' then j := 8 else
    if MONTH = 'SEP' then j := 9 else
    if MONTH = 'OCT' then j := 10 else
    if MONTH = 'NOV' then j := 11 else
    if MONTH = 'DEC' then j := 12; 
    for J:= 2 to 12 do
    repeat
        sum_days := MONDAYS[1] + sum_days;
        j := j - 1
    until j = 1;
    Julian := DAY + sum_days;
    end;

    procedure read_rec;
    begin
      if Eof(FileIn) then
        more_rec := False
      else
        readln(FileIn,day,ch,month)
    end;  { read_rec }

    procedure initialize;
    begin
      more_rec := True;
      Assign(FileIn,'JULIAN.DAT');
      Reset(FileIn);
      Assign(FileOut,'JULIAN.OUT');
      Rewrite(FileOut);
      read_rec
    end;  { initialize }

    procedure process;
    begin
      Julian_Day;
      writeln(FileOut,day:2,' ',month,' ',julian:3);
      read_rec
    end;  { process }

    procedure wrapup;
    begin
      Close(FileOut);
      Close(FileIn)
    end;  { wrapup }

    begin  { main }
      initialize;
      while more_rec do
        process;
      wrapup
    end.

Command Prompt Error

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
program  simplecs;
type mas=array[1..100] of real;
     mas1=array[1..100] of integer;
     label 2, 3, 10;
     var
         r,s,t,a,u,x,xk:mas;
         nb:mas1;
        i,l,k,z1,mi,m1,ni,ne,ip,m,n:integer;
         eps,tmin,teta:real;
procedure sol00(r,s,t:mas;var a,x:mas; n,m:integer);
   var k1,k2,k3,j,mj,l,i:integer;
   BEGIN
       l:=m-2;
   for j:=1 to n do
   begin
   mj:=m*j;
   a[mj]:=0;
   for i:=1 to l do
   begin
   k1:=m*(j-1)+i;
   k2:=l*(j-1)+i;
   a[k1]:=r[k2];
   a[mj]:=a[mj]-r[k2];
   end;
   end;
   for i:=1 to n do
   begin
   k3:=m*i-1;
   a[k3]:=t[i];
   end;
   x[m-1]:=0;
   x[m]:=0;
   for i:=1 to l do
   begin
   x[i]:=s[i];
   x[m]:=x[m]-x[i];
end;END;
 procedure sol01(var u:mas;m:integer);
 var i,j,l:integer;
    BEGIN
    for j:=1 to m do
    for i:=1 to m do
    begin
      l:=m*(j-1)+i;
      u[l]:=0;
      if (i-j)=0 then
      u[l]:=1;
      end;
      END;
  procedure sol02(u,a:mas;m,n,j:integer;var del:real);
  var i,im,ij:integer;
  begin
  del:=0;
  for i:=1 to m do
  begin
  im:=i*m;
  ij:=m*(j-1)+i;
  del:=del+u[im]*a[ij];
  end;
  EnD;
  procedure sol03(var tmin:real;a,u:mas;nb:mas1;m,n:integer;var k:integer);
               var  bul,i,j,m1:integer;
               del:real;
     begin
     tmin:=0;
     m1:=m-2;
     for j:=1 to n do
     begin
    bul:=1;
    i:=1;
    while (bul=1) and (i<=m1) do
    if (j-nb[i])=0  then bul:=2
    else
    i:=i+1;
    if bul<>2 then
    begin
    sol02(u,a,m,n,j,del);
    if (del-tmin)<=0 then
    begin
    tmin:=del;
    k:=j;
    end;
    end;
    end;
    end;
    procedure sol04(u,a:mas;m,n,k:integer;var xk:mas);
    var
        ij,jk,i,j:integer;
      begin
     for i:=1 to m do
     begin
     xk[i]:=0;
     for j:=1 to m do
     begin
     ij:=m*(j-1)+i;
     jk:=m*(k-1)+j;
     xk[i]:=xk[i]+u[ij]*a[jk];
     end;
     end;
     end;
 procedure sol05(x,xk:mas;m:integer;var l:integer;var teta:real;eps:real);
 var
    i,m1:integer;
    r:real;
  begin
    teta:=10000;
    m1:=m-2;
     for i:=1 to m1 do
     if(xk[i]-eps)>=0 then
     begin
     r:=x[i]/xk[i];
    if (r-teta)<=0 then
    begin
    teta:=r;
    l:=i;
    end;
    end;
    end;
  procedure sol06(var x,xk:mas;m,l:integer;var teta:real);
  var i:integer;
  begin
    for i:=1 to m do begin
    If (i-l)<>0 then
    x[i]:=x[i]-teta*xk[i]
    else
    x[i]:=teta;
    end;
    end;
  procedure sol07(var u:mas;m,l:integer;xk:mas);
  var
        m1,j,lj,i,ij:integer;
       begin
    m1:=m-2;
    for j:=1 to m1 do
    begin
    lj:=m*(j-1)+l;
    u[lj]:=u[lj]/xk[l];
    end;
    for i:=1 to m do
    for j:=1 to m1 do
    if (i-l)<>0 then
    begin
    ij:=m*(j-1)+i;
    lj:=m*(j-1)+l;
    u[ij]:=u[ij]-u[lj]*xk[i];
    end;
    end;
  procedure sol08(u,a:mas;m,j:integer;var del:real);
  var mi,ij,i:integer;
  begin
  del:=0;
    for i:=1 to m do
    begin
    mi:=m*i-1;
    ij:=m*(j-1)+i;
    del:=del+u[mi]*a[ij];
    end;
    end ;
 procedure sol09(var tmin:real;var k:integer;a,u:mas;nb:mas1;m,n:integer);
 var bul,m1,i,j:integer;
     del:real;
   begin
   tmin:=0;
   m1:=m-2;
   for j:= 1 to n do
   begin
   bul:=1;
   i:=1;
   while (bul=1)  and (i<=m1) do
   if (j-nb[i])=0 then
   bul:=2
   else
   i:=i+1;
   if bul<>2 then
   begin
   sol08(u,a,m,j,del);
   if (del-tmin)<=0 then
   begin
   tmin:=del;
   k:=j;
   end;
   end;
   end;
   end;
procedure sol10(var tmin:real;u,a:mas;nb:mas1;m,n:integer;var k:integer;
eps:real);
 var bul,m1,i,j:integer;
   del,del1:real;
   begin
       tmin:=0;
       m1:=m-2;
    for j:=1 to n do
      begin
        bul:=1;
        i:=1;
     while (bul=1) and (i<=m1) do
         if (j-nb[i])=0 then
           bul:=2
           else
     i:=i+1;
     if bul<>2 then
     begin
     sol02(u,a,m,n,j,del);
     sol08(u,a,m,j,del1);
     if (abs(del1)-eps)<=0 then
     if (del-tmin)<=0 then
     begin
     tmin:=del;
     k:=j;
     end;
     end;
     end;
     end;
BEGIN
  write(' n');
  read(n);
  writeln('m');readln(m);
  writeln(' (eps)=>');read(eps);
  writeln('ip(ip=1 if MAKS;ip=0 if MIN )=>');
  read(ip);
  for i:=1 to n do
  begin
    writeln('t[',i, ']= ');
    read(t[i]);
    end;
  for i:=1 to m-2 do
  begin
  writeln('s[',i, ']= ');
  read(s[i]);
  end;
  for i:=1 to (m-2)*n do
  begin
   writeln('r[',i, ']= ' );
  read(r[i]);end;
  sol00(r,s,t,a,x,n,m);
  if (ip-1)=0 then
  for i:=1 to n do
  begin
   mi:=m*i-1;
   a[mi]:=-a[mi];
 end;
   sol01(u,m);
   m1:=m-2;
   for i:=1 to m1 do
   nb[i]:=100011+i;
   ni:=0;
   ne:=1;
3:sol03(tmin,a,u,nb,m,n,k);
2:if (tmin+eps)>=0 then
   if (ne)=1 then
   if (x[m]+eps)>=0 then
   begin
   ne:=2;
   for i:=1 to m1 do
   if (nb[i]-10000)>0 then
   ne:=3 ;
   if ne=3 then
   begin
   sol10(tmin,u,a,nb,m,n,k,eps);
    goto 2;
    end  else
    begin
    sol09(tmin,k,a,u,nb,m,n);
    goto 2;
    end;end else
    begin
    ip:=2;
    goto 10;
    end
    else
    if (ip-1)<>0 then
    begin
    x[m-1]:=-x[m-1];
    ip:=1;
    goto 10;
    end
    else
    begin
    ip:=1;
    goto 10;
    end
    else
    begin
    sol04(u,a,m,n,k,xk);
    sol05(x,xk,m,l,teta,eps);
    if (teta+5-10000)<0 then
    begin
    sol06(x,xk,m,l,teta);
    sol07(u,m,l,xk);
    nb[l]:=k;
    ni:=ni+1;
    if ne<>1 then
    if ne=2 then
    begin
    sol09(tmin,k,a,u,nb,m,n);
    goto 2;
    end
    else
    begin
    sol10(tmin,u,a,nb,m,n,k,eps);
    goto 2;
    end
    else
    goto 3;end
     else
     begin
     ip:=3;
     goto 10;
     end; end;
10:  writeln('ip=',ip);
 if ip=1 then begin
    for i:=1 to m-2 do
        writeln('x[', nb[i], ']=',x[i]:13);
        for i:=1  to m-2  do
        writeln('nb[',i,']=',nb[i]);end;
        writeln('f=', x[m-1]:13);
        readln; readln;readln;
END.

Дарова Всем)

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

         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) Передача Функции значения вне её диапазона

Склоняюсь к третьему варианту. Но не представляю, что нужно сделать Real`у чтобы он вышел за границы

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

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

var
hspeed, vspeed:Real;
...
X1:=X1 + hspeed; X2:= X2 + hspeed;
Y1:=Y1 - vspeed; Y2:= Y2 - vspeed;

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

                           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) в которых будет отрисован объект.

———————————————————-

Всё! Есть)))
Нашел ошибку!)))

Кусок Призрак попался)))
Я его вам выделил как красную строку:

{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: Ошибка Проверки диапазона»

  • Ошибка 201 нет файла din соответствующего информационному банку prss
  • Ошибка 201 на телевизоре ютуб
  • Ошибка 201 на телевизоре тсл
  • Ошибка 201 на телевизоре tcl
  • Ошибка 201 на телевизоре lg smart tv