Навигация
|
|||||
Оглавление
|
|||||
Параметры процедур и функций Параметры служат для передачи исходных данных в подпрограммы и для приема результатов работы этих подпрограмм. Исходные данные передаются в подпрограмму с помощью входных параметров, а результаты работы подпрограммы возвращаются через выходные параметры. Параметры могут быть входными и выходными одновременно. Входные параметры объявляются с помощью ключевого слова const; их значения не могут быть изменены внутри подпрограммы: function Min(const A, B: Integer): Integer; Для объявления выходных параметров служит ключевое слово out: Установка значений выходных параметров внутри подпрограммы приводит к установке значений переменных, переданных в качестве аргументов: var После вызова процедуры GetScreenResolution переменные W и H будут содержать значения, которые были присвоены формальным параметрам Width и Height соответственно. Если параметр является одновременно и входным, и выходным, то он описывается с ключевым словом var: procedure Exchange(var A, B: Integer); Изменение значений var-параметров внутри подпрограммы приводит к изменению значений переменных, переданных в качестве аргументов: var При вызове подпрограмм на место out- и var-параметров можно подставлять только переменные, но не константы и не выражения. Если при описании параметра не указано ни одно из ключевых слов const, out, или var, то параметр считается входным, его можно изменять, но все изменения не влияют на фактический аргумент, поскольку они выполняются с копией аргумента, создаваемой на время работы подпрограммы. При вызове подпрограммы на месте такого параметра можно использовать константы и выражения. Пример подпрограммы: function NumberOfSetBits(A: Cardinal): Byte; Параметр A в приведенной функции является входным, но при этом он используется в качестве локальной переменной для хранения промежуточных данных. Разные способы передачи параметров (const, out, var и без них) можно совмещать в одной подпрограмме. В следующем законченном примере процедура Average принимает четыре параметра. Первые два (X и Y) являются входными и служат для передачи исходных данных. Вторые два параметра являются выходными и служат для приема в вызывающей программе результатов вычисления среднего арифметического (M) и среднего геометрического (P) от значений X и Y: program Console; {$APPTYPE CONSOLE} uses procedure Average(const X, Y: Double; out M, P: Double); var begin Существует разновидность параметров без типа. Они называются нетипизированными и предназначены для передачи и для приема данных любого типа. Нетипизированные параметры описываются с помощью ключевых слов const и var, при этом тип данных опускается: procedure JustProc(const X; var Y; out Z); Внутри подпрограммы тип таких параметров не известен, поэтому программист должен сам позаботиться о правильной интерпретации переданных данных. Заметим, что при вызове подпрограмм на место нетипизированных параметров (в том числе и на место нетипизированных const-параметров) можно подставлять только переменные. Передача фактических аргументов в подпрограмму осуществляется через специальную область памяти - стек. В стек помещается либо значение передаваемого аргумента (передача значения), либо адрес аргумента (передача ссылки на значение). Конкретный способ передачи выбирается компилятором в зависимости от того, как объявлен параметр в заголовке подпрограммы. Связь между объявлением параметра и способом его передачи поясняет таблица 2.10: Ключевое слово Назначение Способ передачи Таблица 2.10. Способы передачи параметров |