Объектно-ориентированное программирование

Задачи, решаемые программистами, становятся все объемнее, поэтому новые методы программирования развиваются в сторону упрощения разработки и поддержания сложных программных продуктов. Основное направление развития – попытка приблизить программу как реализацию алгоритма к моделируемой области.

Паскаль позволяет обрабатывать сложные структуры данных: числа, символы, массивы, строки, множества, файлы и записи. Это обеспечивается таким свойством языка, как возможность описания комплексных совокупностей различных базовых типов. Запись, например, позволила создавать программы по формированию и обработке файлов записей различной структуры – баз данных. Алгоритмы обработки информационных полей записей формируются в виде процедур и функций, что позволяет создавать достаточно эффективные программы. Однако зачастую, обрабатывая файлы записей, не удавалось реализовать алгоритмы обработки информационных полей небольшим количеством процедур, а сами процедуры сделать более наглядными. Это привело к необходимости появления таких конструкций, которые бы характеризовались не только информационным составом, но и методами обработки информационных полей. Была создана высшая абстракция данных – объекты и новая технология программирования – объектно-ориентированное программирование.

Объектно-ориентированное программирование (ООП) является воплощением такого подхода и делает возможным построение алгоритма исходя из описания объектов решаемой задачи. Основой программы становятся объекты, являющиеся отображением объектов описываемой модели. Далее на основе сконструированных объектов описываются связи между ними,
в результате чего получается полное описание модели. В отличие от аналогичного описания через переменные и процедуры, разбросанные по разным частям программы, объектное описание модели в программе намного нагляднее, что существенно упрощает работу с моделью. Использование таких возможностей ООП, как наследование и полиморфизм, приводит как
к более ясному описанию самих объектов, так и к удобству их использования в программе. Объектно-ориентированный подход к разработке позволяет провести ее сверху вниз, описывая предметную область на языке программирования, а не снизу вверх, создавая множество программных модулей и соединяя их для получения конечного описания модели.

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

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

В основе объектно-ориентированного программирования лежат понятия объекта, инкапсуляции, наследования и полиморфизма.

Объекты – это сложные структуры данных, которые взаимодействуют друг с другом и окружающим миром, моделируя состояние и взаимодействие объектов реального мира. Объекты напоминают записи: они тоже включают в себя разнотипные поля. Но кроме полей они включают процедуры и функции, использующие эти поля как глобальные параметры, то есть определяющие поведение объекта.

Инкапсуляция – это соединение данных и подпрограмм их обработки в единой структурной единице, защищающее эти данные от некорректного использования. Эта структурная единица, как уже было сказано, является сложным описанием, задающим тип (он называется классом). Она позволяет использовать переменные данного класса – объекты. Представление данных скрывается внутри объектов, и они напрямую (непосредственно) недоступны пользователю. Доступ к ним (инициализация, изменение) возможен только с помощью специальных подпрограмм, образующих интерфейс класса. Это позволяет отделить использование операций от их реализации и упрощает программирование. Мы сталкивались с такой ситуацией в модулях, когда интерфейс и реализация подпрограмм модуля разъединены: интерфейс (Interface) открыт пользователям, а реализация подпрограмм – их текст (Implementation) – закрыта. Подпрограммы обработки данных объекта (методы) становятся такими же компонентами объекта, как и сами данные (поля). Это позволяет наделять объекты собственным поведением, реализуя их взаимодействие путем вызова интерфейсных подпрограмм.

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

Инкапсуляция и наследование обеспечивают свойство полиморфизма операций над объектами – способ выполнения операции, определенный для класса-родителя, можно изменить в классе-потомке, но реализовать методом с тем же именем. То есть полиморфизм – это существование различных реализаций одной и той же операции над данными для объектов разных классов в одной иерархии объектов. Он позволяет использовать один и тот же интерфейс для разных классов, не вникая в различия реализации операций, скрытых в классах.

Пример: создать программу, рисующую на экране точку (используется модуль Graph) и перемещающую ее на некоторое расстояние.

Program Tochka;

Uses CRT, Graph;

Var x, y, dx, dy: Word;

driver, regim: Integer;

Begin

driver:=detect;автоопределение графического драйвера

InitGraph(Driver,Regim,'C:\BP\BGI');инициализация графическогорежима

SetBkColor(1);цвет фона – синий

ClearDevice;очистка экрана

SetColor(14);цвет фигур – желтый

x:=100;x и y – координаты точки

y:=150;

dx:=50; dx и dy – шаги по координатам

dy:=100;

PutPixel(x,y,14);рисуем точку желтым цветом

Delay(1000);задержка 1 сек

PutPixel(x,y,1);там же рисуем точку цветом фона

x:=x + dx;делаем шаг по координатам

y:=y + dy;

PutPixel(x,y,14);рисуем желтую точку на новом месте

Delay(1000);

ReadLn;

CloseGraph;закрываем графический режим

End.

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

Создадим объект, включающий:

поляx и y – его координаты,

методыInit – инициализация – задание начальных значений координат,

Show – появление объекта на экране,

Hide – скрытие объекта,

Move – перемещение объекта на один шаг по координатам.

Поля объекта называются его свойствами. Для описания объектов в Паскале используется специальный тип Object:

Program Tochka;

Uses CRT, Graph;

Type TPix = Object

x, y: Word;координаты точки

Procedure Init(a, b: Word);инициализация объекта:aиb–его начальные координаты

Procedure Show;появление объекта

Procedure Hide;скрытие объекта

Procedure Move(da, db: Word); перемещение объекта: daиdb–шаги по координатам

End;

Procedure TPix.Init;инициализация

Begin

x:=a; xиy –глобальные переменные

y:=b; aиb –входные переменные(формальные параметры) – начальные координаты объекта

End;

Procedure TPix.Show; появление

Begin

PutPixel(x,y,14);помещаем желтую точку по координатамxиy

End;

Procedure TPix.Hide; скрытие

Begin

PutPixel(x,y,1); помещаем синюю (цвет фона) точку
по координатамxиy

End;

Procedure TPix.Move;перемещение

Begin

Hide;скрытие

x:=x + da;изменение координат

y:=y + db; xиy –глобальные переменные

daиdb –входные переменные(формальные параметры) – шаги по координатам

Show;появление

End;

Var x0, y0, dx, dy: Word;

driver, regim: Integer;

pixel: TPix; создаем экземпляр объекта – переменную pixel

Begin

driver:=detect;автоопределение графического драйвера

InitGraph(Driver,Regim,'C:\BP\BGI');инициализация графическогорежима

SetBkColor(1);цвет фона – синий

ClearDevice;очистка экрана

SetColor(14);цвет фигур – желтый

x0:=100; x0 и y0 –начальные координаты точки

y0:=150;

dx:=50; dx и dy – шаги по координатам

dy:=40;

pixel.Init(x0, y0); инициализация точки: задаем начальные координаты точки

pixel.Show; выводим точку на экран по заданным координатам

Delay(1000); пауза в 1 сек

Pixel.Move(dx, dy); перемещаем точкуна dx, dy

Delay(1000); пауза в 1 сек

ReadLn;

CloseGraph;закрываем графический режим

End.

Таким образом:

1) в объекте TPix объединены описания его полей (свойств) и методов – инкапсуляция,

2) доступ к свойствам объекта возможен только через его методы; непосредственное обращение к полям противоречит принципам объектно-ориентированного программирования!

3) поведение объекта полностью определяется его методами Init, Show, Hide, Move,

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

5) перед началом работы с экземпляром объекта (точкой) необходима его инициализация – задание начальных координат точки.

Рассмотрим понятие наследования: используя объект TPix, создадим объект TRing для рисования и перемещения окружности, добавив в новый объект поле rad – радиус окружности и переопределив для нее методы Init, Show, Hide, доставшиеся от родительского типа. Это означает, что в обоих типах будут использованы методы с одними и теми же именами, но с различной реализацией. Поля x и y новый объект унаследует от старого – это будут координаты центра окружности:

Type TRing = Object (TPix) объект TRing – потомокобъекта TPix

rad: Word;радиус окружности

Procedure Init(a, b, r: Word);инициализация объекта:aиb –координатыего центра, r – его радиус

Procedure Show;появление объекта

Procedure Hide;скрытие объекта

End;

Procedure TRing.Init;переопределеннаяинициализация

Begin

x:=a; x, y, rad –глобальные переменные

y:=b; a, b, r –входные переменные(формальные параметры) – координаты центра объекта и его радиус

rad:=r;

End;

Procedure TRing.Show; переопределенноепоявление

Begin

SetColor(14); цвет фигуры - желтый

Circle(x,y,rad);помещаем желтую окружность по координатамxиy

End;

Procedure TRing.Hide; переопределенноескрытие

Begin

SetColor(1); цвет фигуры – синий (цвет фона)

Circle(x,y,rad);помещаем синюю окружность по координатамxиy

End;

Далее поместим головную программу:

Var x0, y0, dx, dy, radius: Word;

driver, regim: Integer;

ring: TRing; создаем экземпляр объекта – переменную ring

Begin

driver:=detect;автоопределение графического драйвера

InitGraph(Driver,Regim,'C:\BP\BGI');инициализация графическогорежима

SetBkColor(1);цвет фона – синий

ClearDevice;очистка экрана

SetColor(14);цвет фигур – желтый

x0:=100; x0 и y0 –начальные координаты центра окружности

y0:=150;

dx:=50; dx и dy – шаги по координатам

dy:=40;

radius:=10; радиус окружности

ring.Init(x0, y0, radius); инициализация окружности: задаем начальные координаты ее центра и радиус

ring.Show; выводим окружность на экран по заданным координатам

Delay(1000); пауза в 1 сек

ring.Move(dx, dy); перемещаем окружностьна dx,dy

Метод ring.Move не был определен при описании объекта TRing, поэтому будет вызван метод родительского объекта pixel.Move –
на экране переместится точка, а не окружность.

Таким образом, если метод объекта-предка не переопределен в объекте-потомке, то будет работать метод объекта-предка.

Вспомним описание этого метода:

Procedure TPix.Move;перемещение

Begin

Hide;скрытие

x:=x + da;изменение координат

y:=y + db;

Show;появление

End;

Можно заметить, что метод Move обращается к методам Show
и Hide. Смысл этих обращений очевиден: сначала объект делается невидимым на экране (вызывается метод Hide), задаются его новые координаты, и он снова делается видимым (вызывается метод Show). Что произойдет, если метод Move использовать в программе одновременно с двумя экземплярами различных объектов: pixel и ring?

Метод Move наследуется объектом TRing от объекта TPix,а методы Hide и Show,поскольку сокрытие и показ окружности на экране осуществляются не так, как точки, в объекте TRing переопределяются
с добавлением новой глобальной переменной rad и заданием цвета фигуры. Для точки при этом никаких осложнений не возникнет, поскольку все вызываемые методы – Init, Show и Hide являются для нее родными.

Что касается окружности, то при вызове метода Ring.Move система пытается обнаружить метод с таким же именем в описании объекта TRing и, не найдя его, продолжает поиски в объекте-предке TPix. В результате имеет место обращение к методу предка pixel.Move. После этого из метода Move вроде бы должны быть вызваны переопределенные методы ring.Hide и ring.Show. Однако этого не происходит: из унаследованного метода pixel.Move экземпляр объекта ring вместо ring.Hide и ring.Show вызывает одноименные методы объекта TPix: pixel.Hide и pixel.Show.

Это объясняется тем, что методы pixel.Move, pixel.Hide и pixel.Show жестко связаны, поскольку они были откомпилированы в едином контексте – объектном типе TPix. Другими словами, связь между этими методами, которая была установлена при компиляции, имеет статический характер. Поэтому в этом случае будет перемещаться точка, а не окружность.

Как сделать так, чтобы методы Hide и Show вызывались в зависимости от того, экземпляр какого объекта обращался к методу Move?

В этом случае используется механизм динамического (позднего) связывания – в отличие от статического (раннего) связывания. Указанный механизм реализуется с помощью виртуальных методов: заголовок виртуального метода в описании объекта-предка дополняется словом Virtual:

Procedure TPix.Show;Virtual;

Procedure TPix.Hide;Virtual;

Если в потомках этого объектного типа имеются переопределенные методы (методы с тем же именем), то они тоже должны быть объявлены
в описании этих потомков как виртуальные и при этом иметь тот же набор формальных параметров, что и метод объекта-предка:

Procedure TRing.Show;Virtual;

Procedure TRing.Hide;Virtual;

В данном случае методы инициализации и перемещения объектов виртуальными не объявляются!В методах же инициализации экземпляров объектов Init вместо слова Procedure используется слово Constructor:

a) для объекта Tpix:

Constructor Init(a, b: Word);

. . . . . . . . . . .

Constructor TPix.Init;

Begin

x:=a;

y:=b;

End;

b) для объекта Tring:

Constructor Init(a, b, r: Word);

. . . . . . . . . . .

Constructor TRing.Init;

Begin

x:=a;

y:=b;

rad:=r;

End;

Теперь при использовании динамического связывания один и тот же метод Move будет работать по-разному (перемещает точку или окружность) – в зависимости от того, какой объект его вызывает. Именно это свойство объектов называется полиморфизмом.

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

Для каждого объекта, содержащего виртуальные методы, в оперативной памяти создается таблица виртуальных методов. Эта таблица содержит указатели на код, соответствующий каждому виртуальному методу, определенному в типе. Связь между экземпляром объекта и его таблицей виртуальных методов устанавливается как раз с помощью конструктора.

Итак, для каждого типа объекта (класса объектов) создается только одна таблиц виртуальных методов, а отдельные экземпляры объекта содержат только адрес этой таблицы. Значение этого адреса и устанавливается процедурой, называемой конструктором. В ней вместо слова Procedure используется слово Constructor.

Таким образом:

· конструктор определяется в каждом объектном типе, имеющем виртуальные методы,

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

· конструктор, помимо описанных в нем действий, устанавливает связь между объектом и таблицей виртуальных методов, содержащей адреса кодов, которые реализуют виртуальные методы,

· сам конструктор виртуальным быть не может.

Доступ к полям объекта рекомендуется осуществлять не напрямую, а только с помощью методов. Такой подход гарантирует корректное использование данных объекта и их защиту от нежелательного доступа, который может повлечь непредсказуемые последствия. Поэтому поля и методы
в описании объектного типа могут быть объявлены как скрытыми, так и общедоступными. Соответствующие разделы в описании объекта открываются директивами Private и Public:

Type TRing = Object (TPix) объект TRing –потомокобъекта TPix

Private скрытые

rad: Word;радиус окружности

Public общедоступные

Constructor Init(a, b, r: Word);инициализация объекта:aиb –координатыего центра, r – его радиус

Private скрытые

Procedure Show;появление объекта

Procedure Hide;скрытие объекта

End;

Скрытыми объявлены: поле rad, процедуры Show и Hide. Общедоступен конструктор Init. Каждая очередная директива Private и Public отменяет действие предыдущей. Если в описании типа указанных директив вообще нет, то все поля и методы считаются общедоступными.

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

Полная программа, использующая два объектных типа TPix и TRing, свойства инкапсуляции, наследования, полиморфизма, виртуальные методы и конструкторы, может выглядеть так:

Program Pix_And_Ring;

Uses CRT, Graph;

Type TPix = Object

Private

x, y: Word;координаты точки

Public

Constructor Init(a, b: Word);инициализация объекта:aиb –его начальные координаты

Private

Procedure Show; Virtual;появление объекта

Procedure Hide; Virtual;скрытие объекта

Public

Procedure Move(da, db: Word);перемещение объекта:daиdb –шаги по координатам

End;

Constructor TPix.Init;инициализация

Begin

x:=a; xиy –глобальные переменные

y:=b; aиb –входные переменные(формальные параметры) – начальные координаты объекта

End;

Procedure TPix.Show; появление

Begin

PutPixel(x,y,14);помещаем желтую точку по координатамxиy

End;

Procedure TPix.Hide; скрытие

Begin

PutPixel(x,y,1); помещаем синюю (цвет фона) точку по координатамxиy

End;

Procedure TPix.Move;перемещение

Begin

Hide;скрытие

x:=x + da;изменение координат

y:=y + db; xиy –глобальные переменные

daиdb –входные переменные(формальные параметры) – шаги по координатам

Show;появление

End;

Type TRing = Object (TPix) объект TRing – потомокобъекта TPix

Private

rad: Word;радиус окружности

Public

Constructor Init(a, b, r: Word);инициализация объекта:aиb –координатыего центра, r – его радиус

Private

Procedure Show; Virtual;появление объекта

Procedure Hide; Virtual;скрытие объекта

End;

Constructor TRing.Init;переопределеннаяинициализация

Begin

x:=a; x, y, rad –глобальные переменные

y:=b; a, b, r –входные переменные(формальные параметры) –координаты центра объекта и его радиус

rad:=r;

End;

Procedure TRing.Show; переопределенноепоявление

Begin

SetColor(14); цвет фигуры – желтый

Circle(x,y,rad);помещаем желтую окружность по координатамxиy

End;

Procedure TRing.Hide; переопределенноескрытие

Begin

SetColor(1); цвет фигуры – синий (цвет фона)

Circle(x,y,rad);помещаем синюю окружность по координатамxиy

End;

Var x0, y0, dx, dy, radius: Word;

driver, regim: Integer;

pixel: TPix; создаем экземпляр объекта TPix – переменную pixel

ring: TRing; создаем экземпляр объекта TRing – переменную ring

Begin

driver:=detect;автоопределение графического драйвера

InitGraph(Driver,Regim,'C:\BP\BGI');инициализация графическогорежима

SetBkColor(1);цвет фона – синий

ClearDevice;очистка экрана

SetColor(14);цвет фигур – желтый

x0:=100; x0 и y0 –начальные координаты центра окружности

y0:=150;

dx:=50; dx и dy – шаги по координатам

dy:=40;

radius:=10; радиус окружности

ring.Init(x0, y0, radius); инициализация окружности: задаем начальные координаты ее центра и радиус

ring.Show; выводим окружность на экран по заданным координатам

Delay(1000); пауза в 1 сек

ring.Move(dx, dy); перемещаем окружностьна dx,dy

x0:=200; x0 и y0 –начальные координаты точки

y0:=250;

dx:=80; dx и dy – шаги по координатам

dy:=50;

pixel.Init(x0, y0); инициализация точки: задаем начальные координаты точки

pixel.Show; выводим точку на экран по заданным координатам

Delay(1000); пауза в 1 сек

Pixel.Move(dx, dy); перемещаем точкуна dx, dy

Delay(1000); пауза в 1 сек

ReadLn;

CloseGraph;закрываем графический режим

End.

Приложение

СООБЩЕНИЯ ОБ ОШИБКАХ

Ошибки при компиляции

Номер ошибки Сообщение Значение
Out of memory Выход за границы памяти
Identifier expected Не указан идентификатор. На этом месте должен находиться идентификатор
Unknown identifier Неизвестный идентификатор. Идентификатор не был описан
Duplicate identifier Повторный идентификатор. Идентификатор уже описан
Syntax error Синтаксическая ошибка. В исходном тексте найден неверный символ
Error in real constant Ошибка в вещественной константе
Error in integer constant Ошибка в константе целого типа
String constant exceeds line Строковая константа превышает допустимые размеры строки
Too many nested files Слишком много вложенных файлов
Unexpected end of file Некорректный конец файла
Line too long Слишком длинная строка
Type identifier expected Требуется идентификатор типа
Too many open files Слишком много открытых файлов
Invalid file name Неверное имя файла. Имя файла неверно или указывает на несуществующий путь
File not found Файл не найден
Disk full Диск заполнен
Invalid compiler directive Неверная директива компилятора
Too many files Слишком много файлов. В компиляции программы или программного модуля задействовано слишком много файлов
Variable identifier expected Требуется идентификатор переменной
Error in type Ошибка в определении типа. Определение типа не может начинаться с этого символа
Structure too large Слишком большая структура. Максимальный размер структурного типа – 64 К
Set base type out of range Базовый тип множества вышел за границы. Базовый тип множества должен представлять собой отрезок порядкового типа с границами 0…255 или перечисляемый тип с не более чем 256 значениями
File components may not be files or objects Компоненты файла не могут быть файлами или объектами
Invalid string length Неверная длина строки. Максимальная описываемая длина строки – 255 символов
Type mismatch Несоответствие типов
Invalid subrange base type Неверный базовый тип диапазона. Диапазон можно описывать для данных порядкового типа
Lower bound greater than upper bound Нижняя граница больше верхней
Ordinal type expected Требуется порядковый тип. Действительный, строковый, структурный и указательный типы в данном случае недопустимы
Integer constant expected Требуется целая константа
31 Constant expected Требуется константа
Integer or real constant expected Требуется целая или вещественная константа
Pointer type identifier expected Требуется идентификатор типа указателя
Invalid function result type Неверный тип результата функции. Правильными типами результатами функции являются все простые, строковые и ссылочные типы
Begin expected Требуется слово Begin
End expected Требуется слово End
Integer expression expected Требуется выражение целого типа

Ordinal expression expected Требуется выражение порядкового типа
Boolean expression expected Требуется выражение логического типа
Operand types do not match operator Типы операндов не соответствуют типу оператора
Error in expression Ошибка в выражении
Illegal assignment Неверное присваивание
Object file too large Объектный файл слишком большой – больше 64 К
Code segment too large Сегмент кода слишком большой – больше 64 К
Data segment too large Сегмент данных слишком большой – больше 64 К
DO expected Требуется слово Do
OF expected Требуется слово Of
INTERFACE expected Требуется интерфейсный раздел
THEN expected Требуется слово Then
TO or DOWNTO expected Требуется слово To или DownTo
Division by zero Деление на ноль
Invalid file type Неверный файловый тип
Cannot Read or Write variables of this type Нельзя считать или записать переменные данного типа
Pointer variable expected Требуется использовать переменную-указатель
String variable expected Требуется строковая переменная
String expression expected Требуется выражение строкового типа
Circular unit reference Циклическая ссылка на модуль. В интерфейсном разделе два модуля не могут ссылаться друг на друга
Unit name mismatch Несоответствие имен программных модулей. Имя программного модуля, найденное в файле .tpu, не соответствует имени, указанному в операторе Uses
Implementation expected Требуется раздел реализации – отсутствует ключевое слово Implementation
Constant and case types do not match Типы констант (меток) и тип выражения (переключателя) оператора Case не соответствуют друг другу
Record variable expected Требуется переменная типа «запись»
Constant out of range Константа выходит за границы допустимых значений
File variable expected Требуется файловая переменная
Pointer expression expected Требуется выражение типа «указатель»
Integer or real expression expected Требуется выражение целого или вещественного типа
Label already defined Метка уже определена
Undefined label in processing statement part Неопределенная метка в обрабатываемом разделе операторов
Unit expected Требуется слово Unit
‘;’ expected Требуется ‘;’
‘:’ expected Требуется ‘:’
‘,’ expected Требуется ‘,’
‘(’ expected Требуется ‘(’
‘)’ expected Требуется ‘)’
‘=’ expected Требуется ‘=’
‘:=’ expected Требуется ‘:=’
‘[’or ‘(‘ expected Требуется ‘[’ или ‘(‘
‘]’or ‘)‘ expected Требуется ‘]’ или ‘)‘
‘.’ expected Требуется ‘.’
‘..’ expected Требуется ‘..’
Too many variables Слишком много переменных
Invalid FOR control variable Недопустимый параметр цикла For – должен быть только порядкового типа
Integer variable expected Требуется переменная целого типа
Files are not allowed here Здесь не допускаются файлы
String length mismatch Несоответствие длины. Длина строковой константы не соответствует количеству элементов символьного массива
String constant expected Требуется константа строкового типа
Integer or real variable expected Требуется переменная целого или вещественного типа
Ordinal variable expected Требуется переменная порядкового типа
Character expression expected Предшествующее выражение должно иметь символьный тип
Overflow in arithmetic operation Переполнение при выполнении арифметической операции – результат операции вышел за диапазон LongInt
No enclosing FOR, WHILE or REPEAT statement Процедуры Break и Continue не могут использоваться вне операторов циклов
CASE constant out of range Метки оператора Case выходят за диапазон –32768…32767
Too many symbols Слишком много идентификаторов – программа описывает более 64 К идентификаторов
Statement part too large Слишком большой раздел операторов – более 24 К

Наши рекомендации