Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0043234_0ADD1_ayap.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
682.5 Кб
Скачать

Параметры-константы

Параметр-константу можно узнать по ключевому слову const перед описанием параметра:

const имя : тип;

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

Например, передача в процедуру Р параметра-константы целого типа записывается так:

procedure P(const x : integer);

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

Параметры составных типов (массивы, записи, строки) предпочтительнее передавать как константы, потому что при этом не расходуется время на копирование и место в стеке.

Результаты работы процедуры следует передавать через параметры-переменные, результат функции - через ее имя.

Нетипизированные параметры

Как можно догадаться из названия, при описании нетипизированных параметров не указывается тип. Передаются они всегда по адресу - либо как константы, либо как переменные, например:

procedure P(const a, b; var y);

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

Пример #2.

Функция сравнения на равенство двух величин произвольного размера и типа.

Function EQ(const x, y; size : word) : boolean;

type mas_byte = array[0 .. MaxInt] of byte;

var n : integer;

begin

n := 0;

while (n < size) and (mas_byte(x)[n] = mas_byte(y)[n]) do inc(n);

EQ := n = size;

end;

В эту функцию фактически передаются только адреса начала расположения в памяти двух переменных, поэтому необходим еще один параметр: длина сравниваемых величин в байтах (параметр size). Единственный способ выяснить, равны ли две величины, размер которых заранее не известен - их побайтное сравнение, поэтому оба параметра приводятся к типу mas_byte, объявленному в функции. При описании массива используется стандартная константа MaxInt, в которой хранится максимальное значение для величин типа integer, то есть 32767.

С помощью функции EQ можно сравнить две любые величины. Пусть, например, в программе описаны переменные:

var a, b : array [1 .. 10] of byte; x: real; c: string;

Следующие обращения к функции EQ будут корректны:

EQ(a, b, sizeof(a)) { сравнение двух массивов }

EQ(a[2], b[5], 4) { сравнение 2-5 элементов массива "a" с 5-8 элементами

массива "b", соответственно }