- •Современные версии Object Pascal
- •Особенности языка
- •Стандарты
- •Синтаксис и языковые конструкции
- •Типы данных
- •Указатели
- •Процедурный тип
- •Операторы управления выполнением программы
- •Процедуры и функции
- •Структура
- •Использование
- •Компиляция и компоновка
- •Загрузка и выгрузка модулей
- •Объектно-ориентированное программирование
Указатели
Паскаль поддерживает использование указателей (типизированные ^тип и нетипизированные pointer):
type
a = ^b;
b = record
x: Integer;
y: Char;
z: a;
end;
var
pointer_to_b:a;
Здесь переменная pointer_to_b — указатель на тип данных b, являющийся записью. Тип типизированного указателя может быть задан перед объявлением типа, на который он ссылается. Это исключение к правилу, которое гласит, что любая вещь должная быть объявлена перед тем, как используется. Введение этого исключения позволило организовывать рекуррентные определения структур данных, в том числе такие, как линейные списки, стеки и очереди, включая указатель на запись в описании этой записи (см. также: нулевой указатель — nil).
Для типизированного указателя определена операция разыменования (её синтаксис: указатель^).
Чтобы создать новую запись и присвоить значение 10 и символ A полям a и b в ней, необходимы следующие операторы:
new(pointer_to_b); { выделение памяти указателю }
pointer_to_b^.x := 10; { разыменовывание указателя и обращение к полю записи }
pointer_to_b^.y := 'A';
pointer_to_b^.z := nil;
...
dispose(pointer_to_b); { освобождение памяти из-под указателя }
Для целей обращения к полям записей и объектов можно также использовать оператор with, как показано в примере:
new(pointer_to_b);
with pointer_to_b^ do
begin
x := 10;
y := 'A';
z := nil
end;
...
dispose(pointer_to_b);
Процедурный тип
В оригинальном языке Паскаль Йенсен и Вирта процедурный тип использовался только при описании формального параметра. Уже в TP существовал полноправный процедурный тип. В объявлении типа ставится заголовок процедуры либо функции (без имени), обобщённо описывающий интерфейс подпрограммы. Значение этого типа содержит указатель на подпрограмму с заголовком, соответствующую описанному в объявлении типа. С помощью идентификатора переменной может происходить вызов соответствующей процедуры или функции.
type myfunc=function:string;
function func1:string;
begin
func1:='func N 1'
end;
function func2:string;
begin
func2:='func N 2'
end;
var fun:myfunc;
begin
fun:=@func1;
writeln(fun) {происходит вызов функции func1}
end.
Операторы управления выполнением программы
Паскаль — язык структурного программирования, что означает, что программа состоит из выполняющихся последовательно отдельных стандартных операторов, в идеале — без использования команды GOTO.
while a <> b do { цикл с предусловием }
writeln('Ожидание');
if a > b then { условный оператор }
writeln('Условие выполнилось')
else { else-секция - может отсутствовать}
writeln('Условие не выполнилось');
for i := 1 to 10 do { итерационный цикл }
writeln('Итерация №', i:1);
with a do {Оператор With - метод ускорения доступа к полям записи}
begin
l:=1;
k:=2;
p:=-3;
end;
repeat { цикл с постусловием }
a := a + 1
until a = 10;
case i of { условный оператор множественного выбора }
0: write('ноль');
1: write('один');
2: write('два')
else write('неизвестное число') { else-секция - может отсутствовать}
end;
В операторах while, for, if, case в качестве выполняемого оператора может использоваться блок. Такая конструкция, представляющая собой обычный оператор или блок, называется сложным оператором.
Для управления процессом компиляции в паскале существуют директивы компилятора. Они помещаются в комментарии и позволяют переключать режимы работы компилятора, например, включать и отключать проверку операций ввода-вывода, проверки переполнения:
assign(inp,'text.txt');
{$I-} { отключение режима IO checking- генерации кода завершения программы в случае ошибки ввода-вывода }
{ (для случая, если файл не найден)}
reset(inp);
{$I+} { включение режима IO checking }
if IOresult=0 then begin { проверяем значение переменой ioresult(<>0 в случае ошибки ввода-вывода) }
...
close(inp);
end else writeln('file not found')
Существуют директивы, аналогичные директивам препроцессора C/C++ ($ifdef, $define, $include), они обрабатываются компилятором в процессе компиляции.