- •Некоторые особенности языка TurboPascal
- •Расширения базового синтаксиса
- •Расширения типов данных
- •Объявления переменных
- •Типизированные константы
- •Выражения и операции
- •Операторы
- •Процедуры и функции
- •Модульное программирование в TurboPascal
- •Общие понятия о модулях
- •Структура модуля
- •Заголовок модуля
- •Раздел интерфейса
- •Раздел реализации
- •Раздел инициализации
- •Описание подключаемых модулей (Uses)
- •Локализация (видимость) имен
- •Компиляция и компоновка модулей
- •Пример программы с модулем
- •Библиотеки модулей
- •Стандартные модули TurboPascal
- •Перечень стандартных модулей
- •Ввод-вывод в TurboPascal
- •Понятие об объектно-ориентированном программировании
- •Концепция объектно-ориентированного программирования
- •Синтаксис объектов в TurboPascal
- •Использование объектов в программе
Объявления переменных
Память.
Максимальный размер сегмента глобальных данных – 65 520 байт. При необходимости иметь больший объем глобальных данных следует делить программу на модули – каждому модулю предоставляется собственный сегмент данных. Размер стека (локальных данных) может задаваться в пределах от 1024 байта до 65520 байтов. По умолчанию 16384 байта. Задать размер стека можно директивой компилятора $M. Размер каждой переменной в динамической памяти типа "куча" не должен превышать 65 520 байтов, . т.е., одного адресного сегмента за вычетом нескольких байтов управляющего блока.
Абсолютные переменные.
<абсолютная переменная>::=<имя> ":" <тип> "Absolute" (<целое без знака> ":" <целое без знака>|<имя переменной>).
Если после слова Absolute указаны два целых без знака, то переменная размещается по абсолютному адресу, указанному этими двумя числами, причем, первое задает адрес начала сегмента, а второе – смещение относительно начала сегмента. Значения этих чисел должны быть в пределах от $0 до $FFFF.
Если после слова Absolute указано имя переменной, то физический адрес начала размещения в памяти новой переменной будет совпадать с адресом начала размещения в памяти указанной переменной (она должна быть описана ранее).
Примеры:
Var IntVector: array [0..1024] of byte absolute 0:0;
{этот массив позволяет обращаться к байтам области
векторов прерываний системы MS DOS}
MyStr:String[40];
MyStrLen:byte absolute MyStr; {Эта переменная позволяет
читать скрытый байт строковой переменной MyStr, в
котором находится текущая длина строки}
Типизированные константы
По своей сути – это переменные, которым присваивается начальное значение в момент запуска программы.
В отличие от обычных констант, которым значение присваивается также в момент запуска программы, и далее не может изменяться, значение типизированных констант можно изменять в ходе работы программы, то есть, можно пользоваться ими как обычными переменными.
Такие константы объявляются в разделе Const и содержат описания типа (как при объявлении переменных) и описания значений (как при объявлении обычных констант). Но обычные константы могут быть только одного из простых типов, а типизированные константы могут быть сложного типа.
<объявление типизированной константы> ::= <имя> ":" <тип> "=" <значение>.
Тип может быть задан именем или описанием конструкции типа.
Следует учитывать, что переменные и типизированные константы, описанные с одинаковой конструкцией типа, но в разных описаниях, считаются относящимися к разным типам данных. Поэтому в описании типизированных констант рекомендуется использовать имя типа. Для этого перед разделом Const с описаниями типизированных констант нужно поместить раздел Type, в котором описать нужные типы, а затем уже описывать константы и переменные этих типов. Тогда все переменные и константы, описанные с одинаковым именем типом, будут относиться к одному типу, и будут совместимыми по присваиванию и операциям, допустимым для данных типов.
Локальные типизированные константы (объявленные внутри процедур и функций) являются статическими локальными переменными. То есть, память для них выделяется на все время работы программы, а не только на время работы процедуры или функции. В них при необходимости можно сохранять информацию до следующего вызова процедуры или функции. Но при этом они недоступны извне процедуры или функции.
Объявления значений типизированных констант могут включать в себя константные выражения, как при объявлении обычных констант. Кроме того, они могут включать в себя адресные константные выражения, состоящие в вычислении адреса, сегмента или смещения глобальной переменной, другой типизированной константы, процедуры или функции.
Типизированные константы не могут входить в константные выражения (за исключением адресных константных выражений), так как по сути они являются переменными.
Примеры с комментариями
Константы простых типов.
Const
Maximum:Integer = 9999;
Factor: Real = -0.1;
Gr: Char = #13; {Значение константы – код возврата
каретки}
В адресных константных выражениях допускается использование адресных функций определения сегмента Seg и смещения Ofs и операции определения адреса @.
Var
Buffer: array [0..1023] of Byte; {объявлен массив для
использования в качестве буфера ввода или вывода}
Const
BufSeg:Word = Seg(Buffer); {константа, содержащая адрес
начала сегмента, в котором расположен буфер в
оперативной памяти}
BufOfs:Word = Ofs(Buffer); {константа, содержащая смещения
начала буфера в сегменте оперативной памяти}
Строковые константы.
Const
Heading:String[7] = 'Section';
NewLine: String[2] = #13#10;{константа содержит символы
перевода строки и возврата каретки}
Reply:String=''; {строка, которая может содержать до 255
символов, в исходном положении пустая (0 символов)}
Константы массивов
Значения констант-массивов записываются перечислением значений элементов через запятую в скобках. Для многомерных массивов используются вложенные скобки. Значения в скобках с самым глубоким вложением соответствуют самому правому индексному типу, указанному в описании типа константы.
Type
Index=array[1..3] of real;
Matrix=array [1..3,1..2] of integer
Const
Ref: Index = (1.2,1.25,1.4);
M:Matrix = ((11,12),(21,22),(31,32));
Константы записей.
Значения констант-записей указываются в скобках, значению каждого поля предшествует имя соответствующего поля с двоеточием. Значения полей отделяются друг от друга точками с запятой.
Type
PlotPoint=Record;
X,Y: Real
Color:Byte;
End;
Const
Dot: PlotPoint = (X: 0.0; Y:10.5; Color: 15);
Константы указателей.
Объявления этих констант обычно содержат адресные выражения для присвоения начальных значений указателям, либо константу Nil.
Type
Ptr=^String; {Тип указателя на строки длиной 255 символов}
Var
S1:String;
Const
P1:Ptr=@S1; {указатель содержит адрес начала строки S1}
P2:Ptr=Nil; {указатель содержит значение Nil}
Константы процедурных типов.
Значениями этих констант являются имена процедур или функций, совместимых с типом константы, то есть, имеющих такую же структуру списка формальных параметров, как в описании типизированной константы. Присвоив константе имя определенной функции далее можно использовать имя константы для вызова соответствующей функции. Затем в программе можно присвоить этой константе имя другой функции и вызывать уже эту функцию по имени той же константы. Также константу процедурного типа можно передавать в качестве фактического параметра в другую процедуру или функцию.
Type
ErrorProc=Procedure(ErrorCode:Byte);
Procedure DefaultError(E:Byte); Far;
Begin
Writeln('Ошибка ', E);
End;
Procedure InputError(E:Byte); Far;
Begin
Writeln('Ошибка ввода данных ', E);
Writeln('Введено недопустимое значение. Повторите ввод')
End;
Const
ErrorHandler:ErrorProc=DefaultError;
После такого описания в программе можно вызвать процедуру обработки ошибки по умолчанию DefaultError следующим образом:
ErrorHandler(50); {50 – номер ошибки,
вызывается DefaultError}
Допустим, далее в программе константе присваивается имя другой процедуры:
ErrorHandler:=InputError;
Теперь по имени той же константы будет вызываться другая процедура.
ErrorHandler(12); {12 – номер ошибки,
вызывается InputError}
Константы типа множество.
Значение таких констант задается стандартным изображением значения типа множество, то есть, в квадратных скобках перечисляется множество значений допустимых элементов множества.
Type
Digits= Set of 0..9;
Letters= Set of 'A'..'Z';
Const
EvenDigits:Digits=[0,2,4,6,8];{множество четных чисел}
Vovels:Letters=['A','E','I','O','U','y']; {множество букв,
используемых для изображения гласных звуков}