Меню

Паскаль ошибка проверки диапазона паскаль

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
uses
  Graph; { Подключаем модуль }
  
var
 Gd, Gm, x0, y0, x, y, xLeft, yLeft, xRight, yRight, n: integer;
 a, b, fmin, fmax, x1, y1, mx, my, dx, dy, num: real;
 c0,c1,c2,c3,c4,c5:real;
 i: byte;
 s: string;
  
 
function F(x: real): real;
begin
  F:=c0+c1*x+c2*x*x+c3*x*x*x+c4*x*x*x*x+c5*x*x*x*x*x; { Функция }
end;
 
begin
  x0 := 0;
  Gd := Detect;
  InitGraph(Gd, Gm, 'C:tp7bgi'); { Инициализируем графический режим }
  { Координаты левой верхней границы системы координат: }
  xLeft := 50;
  yLeft := 50;
  { Координаты правой нижней границы системы координат: }
  xRight := GetMaxX - 50;
  yRight := GetMaxY - 50;
  { интервал по Х; a и b должно нацело делится на dx: }
  a := -2; b := 6; dx := 0.5;
  { Интервал по Y; fmin и fmax должно нацело делится на dy: }
  fmin := -10; fmax := 20; dy := 2;
  { Устанавливаем масштаб: }
  mx := (xRight - xLeft) / (b - a); { масштаб по Х }
  my := (yRight - yLeft) / (fmax - fmin); { масштаб по Y }
  { начало координат: }
  x0 := trunc(abs(a) * mx) + xLeft;
  y0 := yRight - trunc(abs(fmin) * my);
  { Рисуем оси координат: }
  line(xLeft, y0, xRight + 10, y0); { ось ОХ }
  line(x0, yLeft - 10, x0, yRight); { ось ОY }
  SetColor(4); { Цвет шрифта }
  SetTextStyle(1, 0, 1); { Устанавливаем стиль шрифта: }
  OutTextXY(xRight + 20, y0 - 15, 'X'); { Подписываем ось OX }
  OutTextXY(x0 - 15, yLeft - 35, 'Y'); { Подписываем ось OY }
  SetColor(14); { Цвет шрифта }
  { Засечки по оси OX: }
  n := round((b - a) / dx) + 1; { количество засечек по ОХ }
  for i := 1 to n do
  begin
    num := a + (i - 1) * dx; { Координата на оси ОХ }
    x := xLeft + trunc(mx * (num - a)); { Координата num в окне }    
    Line(x, y0 - 3, x, y0 + 3); { рисуем засечки на оси OX }
    str(Num:0:1, s);    
    if abs(num) > 1E-15 then { Исключаем 0 на оси OX }
      OutTextXY(x - TextWidth(s) div 2, y0 + 10, s)
  end;
  { Засечки на оси OY: }
  n := round((fmax - fmin) / dy) + 1; { количество засечек по ОY }
  for i := 1 to n do
  begin
    num := fMin + (i - 1) * dy; { Координата на оси ОY }
    y := yRight - trunc(my * (num - fmin));    
    Line(x0 - 3, y, x0 + 3, y); { рисуем засечки на оси Oy }
    str(num:0:0, s);    
    if abs(num) > 1E-15 then { Исключаем 0 на оси OY }
      OutTextXY(x0 + 7, y - TextHeight(s) div 2, s)
  end;
  OutTextXY(x0 - 10, y0 + 10, '0'); { Нулевая точка }
  { График функции строим по точкам: }
 writeln('The program constructs a graph of the function of a polynomial up to degree 5 inclusive.');
 writeln('Enter the coefficients c0 c1 c2 c3 c4 c5');
 readln(c0,c1,c2,c3,c4,c5);
  x1 := a; { Начальное значение аргумента }
  while x1 <= b do
  begin
    y1 := F(x1); { Вычисляем значение функции }
    x := x0 + round(x1 * mx); { Координата Х в графическом окне }
    y := y0 - round(y1 * my); { Координата Y в графическом окне }
    { Если y попадает в границы [yLeft; yRight], то ставим точку: }
    if (y >= yLeft) and (y <= yRight) then PutPixel(x, y, 12);
    x1 := x1 + 0.001 { Увеличиваем абсциссу }
  end;
  SetColor(15);
  OutTextXY(GetMaxX div 2 - 50, 50, 'y = c0+c1*x+c2*x*x+c3*x*x*x+c4*x*x*x*x+c5*x*x*x*x*x');
  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: Ошибка Проверки диапазона»

Умея
пользоваться массивами, условными
операторами и операторами цикла, вы
можете писать довольно серьезные
программы. При выполнении этих программ
неизбежно будут возникать критические
ошибки, приводящие к аварийному завершению
программы. Такие ошибки по английски
называются 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+}
— это поможет вам найти и устранить все
ошибки. Некоторые неопытные программисты
выключают эти опции, тогда программа
не прерывается при некоторых ошибках,
а продолжает выполняться, на этом
основании делается вывод, что программа
верна. Это самообман — программа
выполняется, но выполняется неправильно
и никак не сообщает об ошибках.

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

  • #
  • #

В этом разделе описаны все ошибки, которые могут случиться при проверке типов.

Сообщение

Описание

Error: Type mismatch

Это может произойти во многих случаях:

Назначенная вами переменная отличается от типа, который используется в выражении

Вы вызываете функцию или процедуру с параметрами, которые несовместимы с параметрами в объявлении функции или процедуры

Error: Incompatible types: got «Сообщ1» expected «Сообщ2»

Невозможно преобразование между двумя типами. Ещё одна причина – типы объявлены в разных объявлениях:

Var A1 : Array[1..10] Of Integer;
  A2 : Array[1..10] Of Integer;
Begin
A1:=A2; {Этот оператор также даёт такую ошибку, потому
          что выполняется строгая проверка типов Pascal}
End.

Error: Type mismatch between «Сообщ1» and «Сообщ2»

Типы не являются эквивалентными.

Error: Type identifier expected

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

Error: Variable identifier expected

Это случается, если вы помещаете константу в процедуру (такую как Inc или Dec), в то время как процедура требует переменной. Для таких процедур в качестве параметров можно помещать только переменные.

Error: Integer expression expected, but got «Сообщение»

Компилятор ожидает выражения типа integer, но получает другой тип.

Error: Boolean expression expected, but got «Сообщение»

Выражение должно быть типа boolean. Оно должно возвращать True или False.

Error: Ordinal expression expected

Выражение должно быть порядкового типа, то есть максимум типа Longint. Эта ошибка случается, например, если вы указали второй параметр процедуры Inc или Dec, который не соответствует порядковому типу.

Error: pointer type expected, but got «Сообщение»

Переменная или выражения не являются указателем. Это случается, если вы помещаете переменную, которая не является указателем, в New или Dispose.

Error: class type expected, but got «Сообщение»

Переменная или выражение не являются типом class. Это обычно случается, если

1.Родительский класс в объявлении класса не является классом

2.Обработчик исключения (On) cсодержит идентификатор типа, который не является классом.

Error: Can’t evaluate constant expression

Эта ошибка может случиться, если границы объявленного вами массива не обозначены порядковыми константами.

Error: Set elements are not compatible

Вы пытаетесь выполнить операцию с двумя множествами, в то время как типы элементов этих множеств не являются одинаковыми. Базовые типы множеств должны быть одинаковыми при объединении.

Error: Operation not implemented for sets

Некоторые бинарные операторы не определены для множеств. Это операторы: div, mod, **, >= и <=. Последние два могут быть определены для множеств в будущих версиях.

Warning: Automatic type conversion from floating type to COMP which is an integer type

Обнаружено явное преобразование типов из real в comp. s encountered. Поскольку comp – это 64-битное целое число, то это может вызвать ошибку.

Hint: use DIV instead to get an integer result

Если подсказки включены, то целочисленное деление с оператором ‘/‘ приведёт к этому сообщению, потому что результатом будет вещественный тип.

Error: string types doesn’t match, because of $V+ mode

Если выполняется компиляция в режиме {$V+}, то строка, передаваемая вами в качестве параметра, должна быть точно такого же типа, как параметр процедуры.

Error: succ or pred on enums with assignments not possible

Если вы объявили перечисляемый тип в стиле С, например, так:

Tenum = (a,b,e:=5);

То вы не сможете использовать функции Succ или Pred с этим перечислением.

Error: Can’t read or write variables of this type

Вы пытаетесь прочитать или записать переменную из файла или в файл текстового типа, который не поддерживает тип переменной. Только целочисленные типы, вещественные, pchars и strings можно читать из файла или записывать в текстовый файл. Логические переменные можно только записывать в текстовый файл.

Error: Can’t use readln or writeln on typed file

readln и writeln можно использовать только с текстовыми файлами.

Error: Can’t use read or write on untyped file.

read и write допускаются только для текстовых или типизированных файлов.

Error: Type conflict between set elements

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

Warning: lo/hi(dword/qword) returns the upper/lower word/dword

Free Pascal поддерживает перегруженную версию lo/hi для longint/dword/int64/qword, которые возвращают наименьшее/наибольшее (результат типа слово/двойное слово) значение аргумента. Turbo Pascal позволяет использовать 16-битные lo/hi, которые возвращают биты 0..7 для lo и биты 8..15 для hi. Если вы хотите получить поведение, аналогичное Turbo Pascal, вы должны использовать приведение типов к word или integer.

Error: Integer or real expression expected

Первый аргумент для str должен быть типа real или integer.

Error: Wrong type «Сообщение» in array constructor

Вы пытаетесь использовать тип в конструкторе массива, который недопустим.

Error: Incompatible type for arg no. Сообщ1: Got «Сообщ2», expected «Сообщ3»

Вы пытаетесь передать неправильный тип в указанный параметр.

Error: Method (variable) and Procedure (variable) are not compatible

Вы не можете связать метод с процедурной переменной или процедуру с указателем на метод.

Error: Illegal constant passed to internal math function

Аргумент-константа, переданный в функцию ln или sqrt выходит за пределы диапазона для этой функции.

Error: Can’t take the address of constant expressions

Невозможно получить адрес выражения-константы, потому что оно не записывается в память. Вы можете попробовать сделать типизированную константу. Эта ошибка может также появиться, если вы пытаетесь поместить свойство в параметр var.

Error: Argument can’t be assigned to

Только выражение, которое может быть в левой части присваивания, может быть передано как вызов по ссылке аргумента. Примечание: Свойства могут использоваться в левой части присваивания, тем не менее, они не могут использоваться как аргументы.

Error: Can’t assign local procedure/function to procedure variable

Не допускается присваивать локальные процедуры/функции процедурным переменным, потому что соглашение о вызовах локальных процедур/функций отличаются. Вы можете только присвоить локальную процедуру/функцию пустому указателю.

Error: Can’t assign values to an address

Не допускается присваивать значение адресу переменной, константы, процедуры или функции. Вы можете попытаться выполнить компиляцию с опцией -So, если идентификатор является процедурной переменной.

Error: Can’t assign values to const variable

Не допускается присваивать значение переменной, которая объявлена как константа. Обычно параметр объявляется как константа. Чтобы иметь возможность изменять значение, передавайте параметр по значению или параметр по ссылке (используя var).

Error: Array type required

Если вы хотите получить доступ к переменной, используя индекс ‘[<x>]‘, то тип должен быть массивом. В режиме FPC указатель также допускается.

Error: interface type expected, but got  «»Сообщение»

Компилятор ожидал для нумератора имя типа интерфейса, но получил нечто другое. Следующий код приведёт к этой ошибке:

Type
TMyStream = Class(TStream,Integer)

Hint: Mixing signed expressions and longwords gives a 64bit result

Если вы делите (или вычисляете модуль) выражения со знаком с типом longword (или наоборот), или если вы имеете переполнение и/или включена проверка диапазона и используется арифметическое выражение (+, -, *, div, mod), в котором оба числа со знаком и появляется longwords, то всё это вычисляется как 64-битная арифметическая операция, которая медленнее, чем обычная 32-битная. Вы можете избежать этого при помощи преобразования типа одного из операндов в подходящий для результата и другого операнда.

Warning: Mixing signed expressions and cardinals here may cause a range check error

Если вы используете бинарный оператор (and, or, xor) и один из операндов — это longword, в то время как другой – это выражение со знаком, то, если проверка диапазона включена, вы можете получить ошибку проверки диапазона, потому что в этом случае оба операнда преобразуются в longword перед выполнением операции. Вы можете избежать этого при помощи преобразования типа одного из операндов в подходящий для результата и другого операнда.

Error: Typecast has different size (Сообщ1 -> Сообщ2) in assignment

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

Error: enums with assignments can’t be used as array index

Если вы объявили перечисляемый тип, который имеет С-подобные присваивания, как показано ниже:

Tenum = (a,b,e:=5);

Вы не можете использовать его как индекс массива.

Error: Class or Object types «Сообщ1» and «Сообщ2» are not related

Выборка из одного класса в другой, в то время как класс/объект не являются связанными. Вероятно, это ошибка ввода.

Warning: Class types «arg1» and «arg2» are not related

Выборка из одного класса в другой, в то время как класс/объект не являются связанными. Вероятно, это ошибка ввода.

Error: Class or interface type expected, but got «arg1»

Компилятор ожидал имя класса или интерфейса, но получил другой тип или идентификатор.

Error: Type «Сообщение» is not completely defined

Эта ошибка случается, если тип не завершён, например, тип pointer, который указывает на неопределённый тип.

Warning: String literal has more characters than short string length

Размер строки-константы, которая связана с shortstring, больше максимального размера для shortstring (255 символов).

Warning: Comparison is always false due to range of values

Это сравнение беззнакового значения и константы со знаком, которая меньше нуля. По причине преобразования оператор всегда будет возвращать FALSE. Выполните явное преобразование константы в правильный диапазон, чтобы избежать этой проблемы.

Warning: Comparison is always true due to range of values

Это сравнение беззнакового значения и константы со знаком, которая меньше нуля. По причине преобразования оператор всегда будет возвращать TRUE. Выполните явное преобразование константы в правильный диапазон, чтобы избежать этой проблемы.

Warning: Constructing a class «Сообщ1» with abstract method «Сообщ2»

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

Hint: The left operand of the IN operator should be byte sized

Левый операнд в операторе IN не является порядковым или перечислением, который помещается в 8 бит. Это может привести к ошибке проверки диапазона. На текущий момент оператор in поддерживает левый оператор только в пределах байта. В случае с перечислениями, размер элемента перечисления может изменяться опциями {$PACKENUM} или {$Zn}.

Warning: Type size mismatch, possible loss of data / range check error

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

Hint: Type size mismatch, possible loss of data / range check error

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

Error: The address of an abstract method can’t be taken

Не найдено тело абстрактного метода, поэтому адрес абстрактного метода не может быть назначен.

Error: Assignments to formal parameters and open arrays are not possible

Вы пытаетесь присвоить значение формальному параметру (нетипизированный var, const или out), или открытому массиву.

Error: Constant Expression expected

Компилятор ожидал выражение-константу, но получил выражение- переменную.

Error: Operation «Сообщ1» not supported for types «Сообщ2» and «Сообщ3»

Операция не допускается для указанных типов.

Error: Illegal type conversion: «Сообщ1» to «Сообщ2»

Когда выполняете преобразование типов, вы должны понимать, что размеры переменной и типа назначения одинаковы.

Hint: Conversion between ordinals and pointers is not portable

Если вы преобразуете тип pointer в longint (или наоборот), то код не будет компилироваться на машинах, использующих 64-разрядную адресацию.

Warning: Conversion between ordinals and pointers is not portable

Если вы преобразуете тип pointer в порядковый тип с другим размером (или наоборот), то могут возникнуть проблемы. Это предупреждение помогает в поиске 32-битного специального кода, где cardinal/longint используются для преобразования указателей в порядковые типы. Решением проблемы является использование вместо этого типов ptrint/ptruint.

Error: Can’t determine which overloaded function to call

Вы вызываете перегруженную функцию с параметром, который не связан с каким-либо объявленным списком параметров, например, когда вы имеете объявленную функцию с параметрами word и longint, а затем вызываете её с параметром типа integer.

Error: Illegal counter variable

Переменная для цикла for должна быть порядкового типа. Переменные циклов не могут быть вещественными числами или строками.

Warning: Converting constant real value to double for C variable argument, add explicit typecast to prevent this.

В C значения вещественных констант по умолчанию имеют тип double. Из этих соображений, когда вы передаёте вещественную константу в функцию С в качестве параметра, компилятор FPC по умолчанию преобразует её в тип double. Если вы хотите контролировать этот процесс, добавьте для константы явное преобразование в нужный тип.

Error: Class or COM interface type expected, but got «Сообщение»

Некоторые операторы, такие как AS, применяются только для классов или COM-интерфейсов.

Error: Constant packed arrays are not yet supported

Вы не можете объявить битовый (упакованный) массив как типизированную константу.

Error: Incompatible type for arg no. Сообщ1: Got «Сообщ2» expected «(Bit)Packed Array»

Компилятор ожидает битовый (упакованный) массив как указанный параметр.

Error: Incompatible type for Сообщение no. Сообщ1: Got «Сообщ2» expected «»(not packed) Array»

Компилятор ожидает регулярный (то есть НЕ упакованный) массив как указанный параметр.

Error: Elements of packed arrays cannot be of a type which need to be initialised

Поддержка упакованных массивов, которым необходима инициализация (таких как ansistrings, или записей, содержащих ansistrings), пока не реализована.

Error: Constant packed records and objects are not yet supported

Вы не можете объявить битовый (упакованный) массив как типизированную константу в данное время.

Warning: Arithmetic «Сообщение» on untyped pointer is unportable to {$T+}, suggest typecast

Сложение/вычитание из нетипизированных указателей может работать по разному в {$T+}. Используёте преобразование типов для типизированных указателей.

Error: Can’t take address of a subroutine marked as local

Нельзя получить адрес подпрограммы, помеченной как локальная.

Error: Can’t export subroutine marked as local from a unit

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

Error: Type is not automatable: «Сообщение»

Только byte, integer, longint, smallint, currency, single, double, ansistring, widestring, tdatetime, variant, olevariant, wordbool и все интерфейсы являются automatable.

Hint: Converting the operands to «Сообщение» before doing the add could prevent overflow errors.

Сложение двух типов может вызвать ошибку переполнения. Обычно вы конвертируете результат в больший тип. Вы должны предотвращать такие ошибки, преобразуя операнды в этот тип перед сложением.

Hint: Converting the operands to «Сообщение» before doing the subtract could prevent overflow errors.

Вычитание между двумя типами может вызвать ошибку переполнения. Обычно вы конвертируете результат в больший тип. Вы должны предотвращать такие ошибки, преобразуя операнды в этот тип перед вычитанием.

Hint: Converting the operands to «Сообщение» before doing the multiply could prevent overflow errors.

Умножение между двумя типами может вызвать ошибку переполнения. Обычно вы конвертируете результат в больший тип. Вы должны предотвращать такие ошибки, преобразуя операнды в этот тип перед умножением.

Warning: Converting pointers to signed integers may result in wrong comparison results and range errors, use an unsigned

Виртуальное адресное пространство на виртуальных машинах располагается от $00000000 до $ffffffff. Многие операционные системы позволяют выделять память с адресами выше $80000000. Например, как WINDOWS, так и LINUX, допускают использование указателей в диапазоне от $0000000 до $bfffffff. Если вы преобразуете типы со знаком, это может вызвать ошибки переполнения и проверки диапазона, но также $80000000 < $7fffffff. Это может вызвать случайную ошибку в коде, подобно этому: «if p>q».

Error: Interface type Сообщение has no valid GUID

Если применяется оператор as для интерфейса или класса, то интерфейс (то есть правый операнд оператора as) должен иметь правильный GUID.

Error: Invalid selector name

Селектор Objective-C не может быть пустым, он должен быть правильным идентификатором или одинарным двоеточием, а если он содержит менее одного двоеточия, он также должен быть завершён.

Error: Expected Objective-C method, but got Сообщение

Селектор может быть создан только для методов Objective-C, не для любых других процедур/функций/методов.

Error: Expected Objective-C method or constant method name

Селектор может быть создан только для методов Objective-C, при задании имени используются строковые константы или идентификатор метода Objective-C, который является видимым из текущей области видимости.

Error: No type info available for this type

Информация о типах не генерируется для некоторых типов, таких как перечисления с пропусками в их диапазоне значений (включая перечисления, нижняя граница которых отлична от нуля).

Error: Ordinal or string expression expected

The expression must be an ordinal or string type.

Error: String expression expected

The expression must be a string type.

Warning: Converting 0 to NIL

Use NIL rather than 0 when initialising a pointer.

Error: Objective-C protocol type expected, but got ”arg1”

The compiler expected a protocol type name, but found something else.

Error: The type ”arg1” is not supported for interaction with the Objective-C runtime

Objective-C makes extensive use of run time type information (RTTI). This format is defined by the maintainers of the run time and can therefore not be adapted to all possible Object Pascal types. In particular, types that depend on reference counting by the compiler (such as ansistrings and certain kinds of interfaces) cannot be used as fields of Objective-C classes, cannot be directly passed to Objective-C methods, and cannot be encoded using objc_encode.

Error: Class or objcclass type expected, but got ”arg1”

It is only possible to create class reference types of class and objcclass

Error: Objcclass type expected

The compiler expected an objcclass type

Warning: Coerced univ parameter type in procedural variable may cause crash or memory corruption: arg1 to arg2

univ parameters are implicitly compatible with all types of the same size, also in procedural variable definitions. That means that the following code is legal, because single and longint have the same size:

{$mode macpas}

Type

  TIntProc = procedure (l: univ longint);

  procedure test(s: single);

    begin

      writeln(s);

    end;

  var

    p: TIntProc;

  begin

    p:=test;

    p(4);

  end.

This code may however crash on platforms that pass integers in registers and floating point values on the stack, because then the stack will be unbalanced. Note that this warning will not flagg all potentially dangerous situations. when test returns.

Error: Type parameters of specializations of generics cannot reference the currently specialized type

Recursive specializations of generics like Type MyType = specialize MyGeneric<MyType>; are not possible.

Error: Type parameters are not allowed on non-generic class/record/object procedure or function

Type parameters are only allowed for methods of generic classes, records or objects

Error: Generic declaration of ”arg1” differs from previous declaration

Generic declaration does not match the previous declaration

Error: Helper type expected

The compiler expected a class helper type.

Error: Record type expected

The compiler expected a record type.

Error: Derived class helper must extend a subclass of ”arg1” or the class itself

If a class helper inherits from another class helper the extended class must extend either the same class as the parent class helper or a subclass of it

Error: Derived record helper must extend ”arg1”

If a record helper inherits from another record helper it must extend the same record that the parent record helper extended.

I’m working on some homework in Pascal for class, and I’ve hit a snag. My basically works, but our homework submission site wasn’t giving me full credit. I emailed my professor and he clued me in to the {$r+} directive. When I include that, I get run-time error 201. I know the issue relates to range-checking, but I can’t figure out which changes will fix the problem. Any help is greatly appreciated, thanks.

{$mode Delphi}
{$r+}
program InversePerm;
var
    N: integer; // Size of set of numbers
    i: integer; // counter
    x: integer; // array-slot counter
    perm: array of integer; // THE array

begin  
    read(N);
    setlength(perm, N); // sets array size to user input
    for i := 1 to N do
      begin
        read(x);
        perm[x] := i;
      end;
    for i := 1 to N do                                                     
      write(perm[i], ' ');
    end.

asked Oct 29, 2017 at 10:33

Reccho's user avatar

3

I think your issue is on the line:

perm[x] := i;

I think what you meant to write was:

perm[i] := x;

Otherwise if I enter 100 to x then your code does perm[100] = 1 on the first iteration. If 10 was entered for N then that would give you a range error.

answered Oct 29, 2017 at 11:05

Philip Smith's user avatar

Philip SmithPhilip Smith

2,72125 silver badges32 bronze badges

5

I’m working on some homework in Pascal for class, and I’ve hit a snag. My basically works, but our homework submission site wasn’t giving me full credit. I emailed my professor and he clued me in to the {$r+} directive. When I include that, I get run-time error 201. I know the issue relates to range-checking, but I can’t figure out which changes will fix the problem. Any help is greatly appreciated, thanks.

{$mode Delphi}
{$r+}
program InversePerm;
var
    N: integer; // Size of set of numbers
    i: integer; // counter
    x: integer; // array-slot counter
    perm: array of integer; // THE array

begin  
    read(N);
    setlength(perm, N); // sets array size to user input
    for i := 1 to N do
      begin
        read(x);
        perm[x] := i;
      end;
    for i := 1 to N do                                                     
      write(perm[i], ' ');
    end.

asked Oct 29, 2017 at 10:33

Reccho's user avatar

3

I think your issue is on the line:

perm[x] := i;

I think what you meant to write was:

perm[i] := x;

Otherwise if I enter 100 to x then your code does perm[100] = 1 on the first iteration. If 10 was entered for N then that would give you a range error.

answered Oct 29, 2017 at 11:05

Philip Smith's user avatar

Philip SmithPhilip Smith

2,72125 silver badges32 bronze badges

5

1 Out of memory (Выход за границы памяти). 2 Identifier expected (Не указан идентификатор). 3 Unknown identifier (Неизвестный идентификатор). 4 Duplicate identifier (Двойной идентификатор). 5 Syntax error (Синтаксическая ошибка). 6 Error in real constant (Ошибка в вещественной константе). 7 Error in integer constant (Ошибка в целой константе). 8 String constant exceeds line (Строковая константа превышает допустимые размеры). 9 Too many nested files (Слишком много вложенных файлов). 10 Unexpected end of file (He найден конец файла). 11 Line too long (Слишком длинная строка) 12 Type identifier expected (Здесь нужен идентификатор типа). 13 Too many open files (Слишком много открытых файлов). 14 Invalid file name (Неверное имя файла). 15 File not found (Файл не найден). 16 Disk full (Диск заполнен). 17 Invalid compiler directive (Неправильная директива компилятора). 18 Too many files (Слишком много файлов). 19 Undefined type in pointer definition (Неопределенный тип в объявлении указателя). 20 Variable identifier expected (Отсутствует идентификатор переменной). 21 Error in type (Ошибка в объявлении типа). 22 Structure too large (Слишком большая структура). 23 Set base type of range (Базовый тип множества нарушает границы). 24 File components may not be files (Компонентами файла не могут быть файлы) . 25 Invalid string length (Неверная длина строки). 26 Type mismatch (Несоответствие типов). 27 Invalid subrange base type (Неправильный базовый тип для типа-диапазона). 28 Lower bound greater than upper bound (Нижняя граница больше верхней). 29 Ordinal type expected (Нужен порядковый тип). 30 Integer constant expected (Нужна целая константа). 31 Constant expected (Нужна константа). 32 Integer or real constant expected (Нужна целая или вещественная константа) . 33 Type identifier expected (Нужен идентификатор типа) 34 Invalid function result type (Неправильный тип результата функции) 35 Label identifier expected (Нужен идентификатор метки). 36 BEGIN expected (Нужен BEGIN). 37 END expected (Нужен END). 38 Integer expression expected (Нужно выражение типа INTEGER). 39 Ordinal expression expected (Нужно выражение перечисляемого типа). 40 Boolean expression expected (Нужно выражение типа BOOLEAN). 41 Operand types do not match operator (Типы операндов не соответствуют операции). 42 Error in expression (Ошибка в выражении). 43 Illegal assignment (Неверное присваивание). 44 Field identifier expected (Нужен идентификатор поля) . 45 Object file too large (Объектный файл слишком большой). 46 Undefined external (Неопределенная внешняя процедура). 47 Invalid object file record (Неправильная запись объектного файла). 48 Code segment too large (Сегмент кода слишком большой). 49 Data segment too large (Сегмент данных слишком велик). 50 DO expected (Нужен оператор DO). 51 Invalid PUBLIC definition (Неверное PUBLIC-определение). 52 Invalid EXTRN definition (Неправильное EXTRN-определение). 53 Too many EXTRN definition (Слишком много EXTRN-определений). 54 OF expected (Требуется OF). 55 INTERFACE expected (Требуется интерфейсная секция). 56 Invalid relocatable reference (Неправильная перемещаемая ссылка). 57 THEN expected (Требуется THEN). 58 TO or DOWNTO expected (Требуется TO или DOWNTO). 59 Undefined forward (Неопределенное опережающее описание). 60 Too many procedures (Слишком много процедур). 61 Invalid typecast (Неверное преобразование типа). 62 Division by zero (Деление на ноль). 63 Invalid file type (Неверный файловый тип). 64 Cannot Read or Write variables of this type (Нет возможности считать или записать переменные данного типа). 65 Pointer variable expected (Нужно использовать переменную-указатель). 66 String variable expected (Нужна строковая переменная). 67 String expression expected (Нужно выражение строкового типа). 68 Circular unit reference (Перекрестная ссылка модулей). 69 Unit name mismatch (Несоответствие имен программных модулей). 70 Unit version mismatch (Несоответствие версий модулей). 71 Duplicate unit name (Повторное имя программного модуля). 72 Unit file format error (Ошибка формата файла модуля). 73 IMPLEMENTATION expected (Отсутствует исполняемая часть модуля). 74 Constant and case types do not match (Типы констант и тип выражения опе- ратора CASE не соответствуют друг другу). 75 Record variable expected (Нужна переменная типа запись). 76 Constant out of range (Константа нарушает границы). 77 File variable expected (Нужна файловая переменная). 78 Pointer expression expected (Нужно выражение типа указатель). 79 Integer or real expression expected (Нужно выражение вещественного или целого типа). 80 Label not within current block (Метка не находится внутри текущего блока) 81 Label already defined (Метка уже определена). 82 Undefined label in processing statement part (Неопределенная метка в предшествующем разделе операторов). 83 Invalid @ argument (Неправильный аргумент операции @). 84 Unit expected (Нужно кодовое слово UNIT). 85 ”;” expected (Нужно указать”;”). 86 ”:” expected (Нужно указать”:”). 87 ”,”expected (Нужно указать”,”). 88 ”(” expected (Нужно указать ”(”). 89 ”)” expected (Нужно указать”)”). 90 ”=” expected (Нужно указать”=”) 91 ”:=” expected (Нужно указать”:=”) 92 ”[” or ”(.”expected (Нужно указать ”[” или ”(.”). 93 ”]” or ”.)” expected (Нужно указать”]” или ”.)”). 94 ”.” expected (Нужно указать”.”) 95 ”..” expected (Нужно указать”..”). 96 Too many variables (Слишком много переменных). 97 Invalid FOR control variable (Неправильный параметр цикла оператора FOR). 98 Integer variable expected (Нужна переменная целого типа). 99 File and procedure types are not allowed here (Здесь не могут использоваться файлы или процедурные типы). 100 String length mismatch (Несоответствие длины строки). 101 Invalid ordering of fields (Неверный порядок полей). 102 String constant expected (Нужна константа строкового типа). 103 Integer or real variable expected (Нужна переменная типа INTEGER или REAL). 104 Ordinal variable expected (Нужна переменная порядкового типа). 105 INLINE error (Ошибка в операторе INLINE) 106 Character expression expected (Предшествующее выражение должно иметь символьный тип). 107 Too many relocation items (Слишком много перемещаемых элементов). 108 Overflow in arithmetic operator (Переполнение при выполнении арифметического оператора). 109 No enclosing FOR, WHILE or REPEAT statement (Нет операторов, заканчивающих операторы FOR, WHILE или REPEAT). 110 Debug information table overflow (Переполнение информационной таблицы отладки) 111 N/A 112 CASE constant out of range (Константа CASE нарушает допустимые границы) . 113 Error in statement (Ошибка в операторе). 114 114 Cannot call an interrupt procedure (Невозможно вызвать процедуру npерывания). 115 N/A 116 Must be in 8087 mode to compile this (Для компиляции необходим режим 8087). 117 Target address not found (Указанный адрес не найден). 118 118 Include files are not allowed here (Здесь не допускаются включаемые файлы). 119 No inherited methods are accessible here (В этом месте программы нет унаследованных методов). 120 N/A 121 Invalid qualifier (Неверный квалификатор). 122 Invalid variable reference (Недействительная ссылка на переменную). 123 Too many symbols (Слишком много символов). 124 Statement part too large (Слишком большой раздел операторов). 125 N/A 126 Files must be var parameters (Файлы должны передаваться как параметры-переменные). 127 Too many conditional symbols (Слишком много условных символов). 128 Misplaced conditional directive (Пропущена условная директива). 129 ENDIF directive missing (Пропущена директива ENDIF). 130 Error in initial conditional defines (Ошибка в условных определениях). 131 Header does not match previous definition (Заголовок не соответствует предыдущему определению). 132 Critical disk error (Критическая ошибка диска). 133 Cannot evaluate this expression (Нельзя вычислить данное выражение). 134 Expression incorrectly germinated (Некорректное завершение выражения). 135 Invalid format specifier (Неверный спецификатор формата). 136 Invalid indirect reference (Недопустимая косвенная ссылка). 137 Structured variable are not allowed here (Здесь нельзя использовать переменную структурного типа). 138 Cannot evaluate without System unit (Нельзя вычислить выражение без мо-дуля SYSTEM). 139 Cannot access this symbol (Нет доступа к данному символу). 140 Invalid floating-point operation (Недопустимая операция с плавающей запятой). 141 Cannot compile overlay to memory (Нельзя выполнить компиляцию оверлейных модулей в память). 142 Procedure or function variable expected (Должна использоваться перемен- ная процедурного типа). 143 Invalid procedure or function reference (Недопустимая ссылка на процедуру или функцию) . 144 Cannot overlay this unit (Этот модуль не может использоваться в качестве оверлейного). 145 Too many nested scopes (Слишком много вложений). 146 File access denied (Отказано в доступе к файлу). 147 Object type expected (Здесь должен быть тип OBJECT) . 148 object types are not allowed (Нельзя объявлять локальные объекты). 149 VIRTUAL expected (Пропущено слово VIRTUAL). 150 Method identifier expected (Пропущен идентификатор инкапсулированного правила). 151 Virtual constructor are not allowed (Конструктор не может быть виртуальным). 153 Destructor identifier expected (Пропущен идентификатор деструктора). 154 Fail only allowed within constructor (Обращение к стандартной процедуре FAIL может содержаться только в конструкторе). 155 Invalid combination of opcode and operands (Недопустимая комбинация кода команды и операндов). 156 Memory reference expected (Отсутствует адрес). 157 Cannot add or subtract relocatable symbols (Нельзя складывать или вычитать перемещаемые символы). 158 Invalid register combination (Недопустимая комбинация регистров). 159 286/287 instructions are not enabled (Недоступен набор команд микропроцессоров 286/287). 160 Invalid symbol reference (Недопустимая ссылка на символ). 161 Code generation error (Ошибка генерации кода). 162 ASM expected (Отсутствует зарезервированное слово ASM).

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Паскаль ошибка переполнения стека
  • Паскаль ошибка ожидалось описание или begin