Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Оператор lock. Описание процедур и функций. Параметры процедур и функций

Поиск

Оператор lock

Оператор lock имеет вид:

lock объект do
оператор

Объект обязательно принадлежит к ссылочному типу.

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

Оператор

lock obj do
oper;

полностью эквивалентен следующему участку кода:

Monitor.Enter(obj);
try
oper;
finally
Monitor.Exit(obj);
end;

Описание процедур и функций

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

Любая используемая в программе процедура или функция должна быть предварительно описана в разделе описаний.

Описание процедуры имеет вид:

procedure имя(список формальных параметров);
раздел описаний
begin
операторы
end;

Описание функции имеет вид:

function имя(список формальных параметров): тип возвращаемого значения;
раздел описаний
begin
операторы
end;

Операторы подпрограммы, окаймленные операторными скобками begin/end, называются телом этой подпрограммы.

Список формальных параметров вместе с окружающими скобками может отсутствовать. Он состоит из одной или нескольких секций, разделенных символом ";". Каждая секция состоит из списка переменных, перечисляемых через запятую, после которого следуют двоеточие и тип. Каждая секция может предваряться ключевым словом var или const, что указывает на то, что параметры передаются по ссылке (см.п. Параметры процедур и функций). Тип формального параметра должен быть либо именем, либо динамическим массивом, либо множеством, либо процедурной переменной (для последних трех типов имеет место структурная эквивалентность типов).

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

Пример описания процедуры приводится ниже:

procedure DoAdd(a,b: real; var res: real);
begin
res := a + b;
end;

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

function Add(a,b: real): real;
begin
Add := a + b;
end;

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

Вместо имени функции, внутри тела функции можно использовать другую специальную переменную с именем Result. В отличие от имени функции, переменную Result можно использовать и в выражениях:

function MinElement(a: array of real): real;
varx: real;
begin

Result := real.MaxValue;
foreach x in a do
if x < Result then
Result := x;
end;

Если внутри функции не присвоить имени функции или переменной Result некоторое значение, то функция вернет в результате своего вызова непредсказуемое значение.

В разделе описаний подпрограммы можно описывать другие подпрограммы. Исключение составляют методы класса, описываемые непосредственно в теле класса: в них нельзя описывать локальные подпрограммы ввиду синтаксической неоднозначности.

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

Если формальный параметр описан с предваряющим ключевым словом var или const, то его называют параметром-переменной и говорят, что он передается по ссылке. Если же параметр описан без слов var или const, то его называют параметром-значением и говорят, что он передается по значению.

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

Например, пусть имеется следующее описание процедуры:

procedure PrintSquare(i: integer);
begin
writeln(i*i);
end;

Тогда при вызове PrintSquare(5*a-b) значение 5*a-b будет вычислено и присвоено переменной i, после чего выполнится тело процедуры.

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

Например, если описана процедура

procedure Mult2(var a: integer);
begin
a := a*2;
end;

то после вызова Mult2(d) значение d увеличится в 2 раза.

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

При передаче параметра по ссылке в подпрограмму передается адрес фактического параметра. Поэтому если параметр занимает много памяти (массив, запись), то обычно он также передается по ссылке. В результате в процедуру передается не сам параметр, а его адрес, что экономит память и время работы. При этом если параметр меняется внутри подпрограммы, то он передается с ключевым словом var, если не меняется - с ключевым словом const:

Например:

type
Person = record
name: string;
age,height,weight: integer;
end;

procedure Print(const p: Person);
begin
write(p.name,' ',p.age,' ',p.height,' ',p.weight);
end;

procedure IncAge(var p: Person);
begin
Inc(p.age);
end;

Отметим особенности передачи строк и динамических массивов в качестве параметров подпрограмм.

Поскольку динамический массив является ссылкой, то при изменении формального параметра-динамического массива внутри подпрограммы меняется соответствующий фактический параметр. Например, в результате работы программы

procedure p(a: array of integer);
begin
a[1] := 2;
end;

var b: array of integer := (1,1);

begin
p(b);
writeln(b[1]);
end.

будет выведено 2. Передавать динамические массивы по ссылке имеет смысл только в случае если память под динамический массив перераспределяется внутри подпрограммы:

procedure q(var a: array of integer);
begin
SetLength(a,10);
end;

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

var s: string := 'abc';
s[2] := 'd';

память под строку s будет перераспределена, и ссылка s будет указывать на новый участок динамической памяти. Это приводит к тому, что строки, несмотря на свою ссылочную природу, ведут себя при передаче параметров как размерные типы: Например, в результате выполнения кода

procedure r(s: string);
begin
s[2] := 'd';
end;

var ss: string := 'abc';

begin
r(ss);
writeln(ss[2]);
end.

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



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 3; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.24.148 (0.006 с.)