Неизвестное имя в паскале как исправить

от admin

(5) Исправление ошибок. Отладка программы.

Сообщения об ошибках.Ошибки в программах делятся на те, которые Паскаль замечает, и на те, что не замечает и в принципе заметить не может. К первым относятся все синтаксические погрешности, например,BIGINвместоBEGIN. Их Паскаль замечает еще на стадии компиляции. На стадии выполнения он замечает такие ошибки, какSqrt(-25), то есть квадратный корень из ‑25. Но вот, если вы, желая возвести числоa в куб, вместоa*a*aпишетеa*a, то этого не заметит ни один язык в мире.

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

Обнаружив ошибку на стадии выполнения, Паскаль выдает белыми буквами на черном фоне окна пользователя сообщение Runtime errorи иногда золотыми буквами на красном фоне краткое описание ошибки и ставит курсор в то место программы, где, по его мнению, она находится.

Вот наиболее типичные для начинающих сообщения об ошибках того и другого рода:

Вероятная причина ошибки

Unexpected end of file

Неожиданный конец файла

Вы забыли поставить точку после последнего END. Или не совпадает количествоbeginи количествоend

Ждал точку с запятой

Вы забыли поставить точку с запятой после предыдущего оператора

Вы указали слишком мало параметров в обращении к подпрограмме

Вы указали слишком много параметров в обращении к подпрограмме

Вы забыли описать это имя в разделе описаний

Неправильно записали стандартное имя, например, ReedLnвместоReadLn

В вашей программе встречаются примерно такие «сладкие парочки»: VAR c:String; … c:=1+2илиVAR h:Integer; … h:=9/7

Одно и то же имя описано два раза. Например, VAR a, c, a :String;

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

Возможно, не совпадает количество beginи количествоend

Возможно, не совпадает количество beginи количествоend

String constant exeeds line

Строковая константа превышает допустимую длину

Вы забыли закрыть кавычки в строковой константе

Строчка слишком длинна

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

На вашем диске не осталось места. Надо что-то стереть

Lower bound greater than upper bound

Нижняя граница диапазона больше верхней

Например, вы вместо array[2..5]написалиarray[5..2].

Invalid floating point operation

Неправильная операция с вещественным результатом

Sqrt(-25)илиa/0или что-нибудь в этом роде

Ordinal expression expected

Ждал выражение порядкового типа

Например, вы вместо for i:=1 to 8написали for i:=1 to 8.5

Error in expression

Ошибка в выражении

Например, вы вместо k:=а*8написалиk:=а**8

Range check error

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

Переменная в процессе выполнения программы вышла за пределы допустимого диапазона, как например, в 1.9

Constant out of range

Константа не в диапазоне

Величина константы в программе превосходит допустимый диапазон

Invalid numeric format

Неправильный числовой формат

Если, например, вы по оператору ReadLn(k)в программеVAR k:Integer; …. ReadLn(k) … пытаетесь ввести число 25.3

Более подробное описание некоторых ошибок вы найдете в 0.3.

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

expected ждал

identifier имя

invalid неправильный

operation операция

error ошибка

variable переменная

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

Читать:
Как сделать инжектор dll

Начало. Возможные ошибки

Все используемые переменные должны быть предварительно описаны с помощью ключевого слова var (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы).

Отсутствующая ;

Очень частая ошибка у начинающих. Курсор, как правило, позиционируется в начале следующей строки.

Несовместимость типов при присваивании

Безболезненно можно присваивать только данные одного типа. Если данные — разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ — в строку. Обратные преобразования не допускаются.

Чтобы не ошибаться в подобных простых случаях в Паскале есть следующая краткая форма объявления и инициализации переменной:

Отсутствие закрывающего апострофа литеральной строки

Закрыть апостроф надо на той же строке, где расположен открывающий апостроф

Ошибки расстановки запятых и апострофов при выводе строк и выражений

Слишком много запятых и апострофов рядом, потому начинающие часто путаются :) Надо уяснить правила:

  • запятые разделяют разные элементы вывода
  • все, что находится в апострофах, будет выведено на экран без изменений

Ошибка ввода

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

Аналогичный фрагмент в более современном и предпочтительном синтаксисе:

Ошибка неинициализированной переменной

Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.

Деление на 0

Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.

что делать? Пишет в паскале abc неизвестный идентификатор detect. В чём ошибка?

program rab;
uses graphabc;
var x, dd:real;
x1,x2:real;
y:real;
mx, my:integer;
px, py:integer;
gd, gm: integer;
begin gd:= DETECT;
initgraphgd (gd,gm);
x0:=320; y0:=240; mx:20; my:=20;
line(10, y0, 630, y0); 1.5 ïðÿìàÿ y(x1,y1), b(x2,y2);
line(x0,10 x0, 470);
x:=0.1; x2:=10; dx:=0.0001;
x:=x1;
while (x1

program rab;
uses graphabc;
var x, dd:real;
x1,x2:real;
y:real;
mx, my:integer;
px, py:integer;
gd, gm: integer;
begin gd:= DETECT;
initgraphgd (gd,gm);
x0:=320; y0:=240; mx:20; my:=20;
line(10, y0, 630, y0); 1.5 ïðÿìàÿ y(x1,y1), b(x2,y2);
line(x0,10 x0, 470);
x:=0.1; x2:=10; dx:=0.0001;
x:=x1;
while (x1

Что такое detect? Откуда он взялся?

На PascalABC первые строки программы должны быть вот такими:

program rab;
uses graphabc;
var x, dd:real;
x1,x2:real;
y:real;
mx, my:integer;
px, py:integer;
gd, gm: integer;
begin gd:= DETECT;
initgraphgd (gd,gm);
x0:=320; y0:=240; mx:20; my:=20;

То, что вычеркнуто, нужно удалить из программы.

Не нужны там ни какие инициализации… Это было в Turbo Pascal-e!

Обсуждали тут уже, используй windowsfix.ru

Спрашивали тут уже, юзай mwfix

Pascal | Коды ошибок

§ Если в меню Options?Linker?Link Buffer, установлен параметр Memory, переключите его в значение Disk.

§ несоответствующее количество begin и end (не забудьте, что оператор case также заканчивается словом end);

§ включаемый файл заканчивается в середине раздела операторов. Каждый раздел операторов должен целиком помещаться в одном файле;

§ несовместимые типы переменной и выражения в операторе присваивания;

§ несовместимые типы фактического и формального параметров в обращении к процедуре или функции;

§ тип выражения, несовместимый с типом индекса при индексировании массива;

§ Идентификатор обозначает абсолютную переменную.

§ Файл .com содержит ссылки с размерами в байтах на перемещаемые идентификаторы. Такая ошибка происходит в случае, если вы используете операторы HIGH и DOWN с перемещаемыми идентификаторами или если вы ссылаетесь в директивах DB на перемещаемые идентификаторы.

§ Операнд ссылается на перемещаемый идентификатор, который не был определен в сегменте CODE или в сегменте DATA.

Похожие статьи