Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ.docx
Скачиваний:
2
Добавлен:
23.04.2019
Размер:
210.36 Кб
Скачать

7. Операторы Object Pascal

Пустой оператор обозначается знаком "точка с запятой".

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

Условный оператор if отвечает за ветвление, т.е. выполнение (или невыполнение) того или иного варианта кода в зависимости от условий. В целом синтаксис инструкции:

if <условие> then <код> [else <альтернативный код>]

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

case [выражение-селектор] of   <значение 1>: <код для значения 1>; ...   <значение N>: <код для значения N>;   [else <код для непредусмотренных явно значений>;] end

Оператор цикла for обычно применяют в тех случаях, когда количество возможных повторов известно заранее. Он имеет 2 варианта написания: в первом случае (с использованием цикла for-to) при каждом проходе цикла, называемом итерацией, значение параметра увеличивается на 1, а во втором (for-downto) - уменьшается на 1.

Операторы циклов while и repeat. Цикл с предусловием - оператор while:

while <Условие> do <тело цикла> Этот цикл будет выполняться до тех пор, пока верно выражение, указанное в качестве условия. В отличие от while, цикл с постусловием, задаваемый при помощи оператора repeat, всегда выполняется хотя бы 1 раз, поскольку проверку на соответствие условию он проходит после того, как будет выполнено его тело:

repeat <тело цикла> until <условие>

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

8.Динамическое распределение памяти в Object Pascal. Указатели.

В Object Pascal выделение динамической памяти может происходить одним из нескольких способов. Возможно, лучшим из них является использование функции AllocMem, которая заполняет выделенную память нулями. (Другой способ динамического распределения памяти — это применение процедуры GetMem или функции New.) Давайте снова вернемся к нашей записи TMailingListRecord. В предыдущих примерах мы выделяли память для записей этого типа из стека:

var

MLRecord : TMailingListRecord;

begin

{ Заполнение данными записи MLRecord }

MLRecord.FirstName := 'Per';

MLRecord.LastName := 'Larsen'; { и т.д.}

end;

Теперь мы создадим эту запись динамически:

var

APtr : PMailingListRecord;

begin

APtr := AllocMem(SizeOf(TMailingListRecord));

APtr.FirstName := 'Per';

APtr.LastName := 'Larsen';

{Другой программный код}

FreeMem(APtr);

end;

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

Если для записей и массивов динамическое выделение памяти является делом вкуса, то в случае классов оно носит уже обязательный характер. Чуть позже мы обсудим этот вопрос более подробно

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

С помощью ключевого слова nil можно определить указатель, который не содержит никакого значения Если по каким-либо причинам вы хотите очистить некоторый указатель, вы можете сделать это следующим образом: SomePointer := nil;

Кроме того, с помощью nil можно проверить, была ли выделена для него память:

if SomePointer = nil then

SornePointer := AllocMem (Size);

Здесь происходит проверка указателя на наличие какого-либо значения. Если оно отсутствует, происходит выделение памяти.