Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Объявление и определение подпрограммы




 

Здесь мы рассмотрим два важных понятия, связанных с подпрограммами – объявление и определение. Так, подпрограммы должны быть всегда определены. Их объявления – не обязательны.

 

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

Подпрограмму надо объявлять когда она:

· будет использоваться в других модулях

· является методом класса.

 

 

Новый термин. Определение подпрограммы – это код, реализующий алгоритм процедуры или функции. Определения подпрограмм размещают в секции implementation.

 

Объявления процедур и функций располагают в интерфейсной секции модуля. В этом случае подпрограммы становятся доступными в других модулях. Если функция или процедура не должна вызываться из других модулей, ее надо просто определить. При этом следует разместить ее определение в разделе реализации раньше первого обращения к ней. Во всех примерах, рассмотренных выше, так и делалось. Можно было бы поступить иначе, т.е. применить как объявление, так и описание. Ниже приведен фрагмент модуля, где имеется объявление функции Multiply, метод Button1Click, который ее вызывает, а также описание функции Multiply:

 

unit Unit1;

Interface

{ часть исходного кода опущена... }

function Multiply(Num1, Num2: Integer): Integer;

Implementation

procedure TForm1.Button1Click(Sender: TObject);

Var

X: Integer;

Begin

X:= Multiply(10, 20);

end;

function Multiply(Num1, Num2: Integer): Integer;

Begin

Result:= Num1 * Num2;

end;

End.

 

В данном примере объявление функции Multiply необходимо, ибо ее определение расположено ниже кода метода Button1Click, в котором она используется. Таким образом, объявление функции как бы информирует компилятор о том, что ее определение можно найти ниже по тексту модуля.

 

ПРИМЕЧАНИЕ Если вы объявили функцию, но не дали ее определения, компилятор выдаст ошибку вида

Unsatisfied forward or external declaration: 'Multiply.'

 

Параметры подпрограмм

 

Здесь мы определим важное понятие о способе передачи параметров в подпрограммы.

Любой параметр подпрограммы может передаваться ей как

– значение;

– переменная;

– константа.

 

Параметры – значения. Во–первых, параметры можно передать по значению. Все параметры подпрограмм рассмотренных выше являются параметрами–значениями. Параметр–значение ведет себя подобно локальной переменной функции или процедуры. Внутри подпрограммы такому параметру можно присвоить какое–то значение, но это никак не отразится на значении фактического параметра. Чтобы продемонстрировать эту особенность, опишем новую функцию, которую назовем SquareAndMultiply. У этой функции два параметра. Возведем их в квадрат, перемножим и вернем результат:

 

function SquareAndMultiply(Num1, Num2: Integer): Integer;

Begin

Num1:= Num1 * Num1;

Num2:= Num2 * Num2;

Result:= Num1 * Num2;

end;

 

Код, тестирующий данную функцию, имеет вид:

 

procedure TForm1.Button1Click(Sender: TObject);

Var

X: Integer;

Y: Integer;

Z: Integer;

Begin

X:= 2;

Y:= 3;

Z:= SquareAndMultiply(X, Y);

Label1.Caption:= IntToStr(Z);

end;

 

Протестируйте этот код самостоятельно. Два значения передаются в функцию SquareAndMultiply. Оба значения изменяются внутри функции SquareAndMultiply. Однако, при возврате из функции переменные X и Y не изменяются. Если функция использует параметр–значение, компилятор создает его копию и передает ее в функцию. Оригинал параметра в подпрограмме недоступен и поэтому остается неизменным.

 

Параметры – константы. Параметр–константу нельзя изменять в теле подпрограммы. Ниже дан пример процедуры с параметром–константой:

 

procedure SaySomething(const S: string);

Begin

S:= S + `Test';

ShowMessage(S);

end;

 

В тексте этой подпрограммы имеется ошибка. Компилятор зафиксирует ошибку в первом операторе с сообщением «Left side cannot be assigned to». Ошибка заключается в том, что формальный параметр S объявлен константой, а значение константы изменить нельзя. Всегда объявляйте константами те параметры, которые в теле подпрограммы изменяться не должны. Кроме того, следует помнить, что вариант procedure SaySomething(const S: string) предпочтительней чем procedure SaySomething(S: string) даже тогда когда параметр не модифицируется. В первом случае компилятор не создает копию строки S и, тем самым, экономит память.

 

Параметры–переменные. Третий вид параметров подпрограммы – это параметры–переменные. Иногда говорят, что параметр передается в подпрограмму по наименованию. В этом случае компилятор не создает копию параметра, как это имеет место в случае передачи параметра по значению. Это означает, что любое изменение формального параметра в подпрограмме отражается на значении фактического параметра. Пример использования параметра–переменной иллюстрирует следующий код:

 

procedure Square(var Number: Integer);

Begin

Number:= Number * Number;

end;

procedure TForm1.Button1Click(Sender: TObject);

Var

X: Integer;

Begin

X:= 20;

Square(X);

Label1.Caption:= IntToStr(X);

end;

Параметру–переменной предшествует ключевое слово var.

 

ПРИМЕЧАНИЕ: Большинство ключевых слов языка Object Pascal имеет «двойное применение». В данном случае слово var используется для обозначения способа передачи параметра в подпрограмму, который известен как передача параметра по наименованию. Выше слово var использовалось для описания переменных в модуле, в процедуре или в функции. Компилятор распознает контекст, в котором встречает то или иное ключевое слово, и трактует его надлежащим образом.

 

Подпрограмма Square модифицирует свой параметр, умножая его на самого себя. В коде метода Button1Click эта подпрограмма вызывается и ей передается параметр–переменная метода X, которой присвоено значение 20. В результате выполнения кода Square переменная X получит значение 400. Так как параметр передается по наименованию (в нашем случае это переменная X), процедура «имеет право» изменить его первоначальное значение. Всегда используйте параметры–переменные когда процедура или функция должна изменять их значения. Тот факт, что некоторый объект может быть изменен процедурой или функцией, является весьма важным аспектом параметров–переменных.

Отметим важное требование. Так, если формальный параметр в подпрограмме объявлен с ключевым словом var, то фактически передаваемым в подпрограмму параметром может быть только переменная, объявленная в коде, который эту подпрограмму вызывает. Например, нельзя обращаться к подпрограмме Square так:

 

Square(30);

 

При компиляции такой строки будет зафиксирована ошибка. Действительно, здесь мы имеем явное противоречие: как можно заменить явное значение 20 другим?

Следующий код тоже некорректен:

 

Var

X: Word;

Begin

X:= 20;

Square(X);

............

 

В данном случае имя X объявлено как переменная типа Word, а формальный параметр процедуры Square объявлен Integer. Компилятор сообщит об этом так: «Types of actual and formal var parameters must be identical» т.е. типы фактических и формальных параметров–переменных должны быть одинаковы.

 

ПРИМЕЧАНИЕ: Функция может вернуть только одно значение – результат. Используя параметры–переменные можно получить от функции побочные результаты. В точку вызова функции возвращается только один результат, но объекты, которые ей переданы по наименованию, будут изменены.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...