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. |
В этом разделе описаны все ошибки, которые могут случиться при проверке типов.
Сообщение |
Описание |
---|---|
Error: Type mismatch |
Это может произойти во многих случаях: •Назначенная вами переменная отличается от типа, который используется в выражении •Вы вызываете функцию или процедуру с параметрами, которые несовместимы с параметрами в объявлении функции или процедуры |
Error: Incompatible types: got «Сообщ1» expected «Сообщ2» |
Невозможно преобразование между двумя типами. Ещё одна причина – типы объявлены в разных объявлениях: Var A1 : Array[1..10] Of Integer; |
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 |
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. |
Дарова Всем)
Столкнулся с теоретически невозможной ошибкой (!=) округления 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: Ошибка Проверки диапазона»
Как можно более точное преобразование:
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 не имеет проверок диапазона, поэтому там он не дает вам ошибки. Но у вашего Pascal есть, и этот цикл, вероятно, потому, что вы получаете ошибку времени выполнения 201.
Я не знаю, что должна делать эта программа, но меня не удивило бы, если бы программа C не принесла правильный результат.
Меня также не удивит, если для значений n
близких к 99, вы получите ошибку (или его эквивалентное количество времени выполнения). Если пользователь вводит значения для n > 99
, это, вероятно, вызовет ошибку проверки диапазона, когда-то, если ошибка не будет первой.
Я пробовал с n = 80
, и это заняло много времени, поэтому я Ctrl + C.
В качестве альтернативы вы можете использовать
a: array[1..100] of Boolean;
но это не соответствует программе C. В C все массивы основаны на нуле. Если исходная программа C работает правильно, тогда мой перевод Pascal также должен быть.
Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
Pascal.doc
Скачиваний:
26
Добавлен:
12.03.2016
Размер:
3.29 Mб
Скачать
Сообщения
об ошибках.Ошибки в
программах делятся на те, которые
Паскаль замечает, и на те, что не замечает
и в принципе заметить не может. К первым
относятся все синтаксические погрешности,
например,BIGINвместоBEGIN.
Их Паскаль замечает еще на стадии
компиляции. На стадии выполнения он
замечает такие ошибки, какSqrt(-25),
то есть квадратный корень из ‑25. Но
вот, если вы, желая возвести числоa
в куб, вместоa*a*aпишетеa*a,
то этого не заметит ни один язык в мире.
Обнаружив
грамматическую ошибку, Паскаль выдает
золотыми буквами на красном фоне краткое
описание ошибки и ставит курсор в то
место программы, где, по его мнению, она
находится.
Обнаружив ошибку
на стадии выполнения, Паскаль выдает
белыми буквами на черном фоне окна
пользователя сообщение Runtime
errorи иногда золотыми буквами
на красном фоне краткое описание ошибки
и ставит курсор в то место программы,
где, по его мнению, она находится.
Вот наиболее
типичные для начинающих сообщения об
ошибках того и другого рода:
Сообщение |
Перевод |
Вероятная |
Unexpected end of file |
Неожиданный |
Вы забыли |
“;” expected |
Ждал точку с |
Вы забыли |
“,” expected |
Ждал запятую |
Вы указали |
“)” expected |
Ждал скобку “)” |
Вы указали |
Unknown identifier |
Неизвестное |
Вы забыли описать
Неправильно |
Type mismatch |
Несовпадение |
В вашей программе |
Duplicate identifier |
Дубль имени |
Одно и то же имя |
Syntax error |
Синтаксическая |
Паскаль |
BEGIN |
Ждал BEGIN |
Возможно, не |
END |
Ждал |
Возможно, не |
String |
Строковая |
Вы забыли закрыть |
Line too long |
Строчка слишком |
Слишком длинная |
Disk full |
Диск заполнен |
На вашем диске |
Lower bound greater than |
Нижняя граница |
Например, вы |
Invalid floating point |
Неправильная |
Sqrt(-25)илиa/0или что-нибудь в этом роде |
Ordinal expression |
Ждал выражение |
Например, вы |
Error in expression |
Ошибка в выражении |
Например, вы |
Range check error |
Ошибка проверки |
Переменная |
Constant out of range |
Константа не в |
Величина |
Invalid numeric format |
Неправильный |
Если, например, |
Более подробное
описание некоторых ошибок вы найдете
в 0.3.
Понять смысл
многих других сообщений об ошибках вам
поможет перевод некоторых часто
встречающихся в сообщениях слов:
expected
ждал
identifier
имя
invalid
неправильный
operation операция
error
ошибка
variable переменная
Невозможно создать
компилятор, который бы всегда точно
находил место и причину ошибки. Поэтому
приготовьтесь к тому, что некоторые
сообщения вы будете долго разглядывать
в недоумении. Считайте их не реальными
ошибками, а намеками на реальные ошибки.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #