<<
>>

Формальные и фактические параметры

Объявление процедуры или функции содержит список формальных параметров. Каждый параметр из списка формальных Параметров является локальным по отношению к процедуре или функции, для которой он объявлен.
Это означает, что глобальные переменные, имена которых совпадают с именами формальных параметров, становятся недоступными для использования в Процедуре или функции. Отдельные объявления параметров в списке разделяются Точкой с запятой. Синтаксис списка формальных параметров следующий: ::= сОбъявление параметра>| сСписок формальных параметров>; сОбъявление параметра> Все формальные параметры можно разбить на две категории: • параметры, вызываемые подпрограммой по своему значению (т. е. параметры, которые передают в подпрограмму свое значение и не меняются в результате выполнения подпрограммы); • параметры, вызываемые подпрограммой по наименованию (т. е. параметры, которые становятся доступными для изменения внутри подпрограммы). Главное различие этих двух категорий — в механизме передачи параметров в подпрограмму.
При вызове параметра по значению происходит копирование памяти, занимаемой параметром, и стек и использование в дальнейшем в операторах подпрограммы локальной копии параметра. Основное значение параметра I (l'iis Попов (глобальное по отношению к подпрограмме) при этом остается без изменения. Следует отметить, что использование такого механизма при передаче, например, массивов большой длины может отрицательно влиять на быстродействие программы и заполняет стек лишней информацией. При вызове параметра по наименованию в процедуру передается адрес памяти (глобальной по отношению к подпрограмме), в которой размещено значение параметра, и в качестве локальной переменной выступает ссылка на глобальное размещение параметра, обеспечивающая доступ к самому значению. Объявление формального параметра обязательно содержит имя (идентификатор) параметра и, как правило, его тип, отделяющийся от имени двоеточием.
Несколько однотипных параметров могут объединяться в одно объявление. При этом их имена перечисляются через запятую. При обращении к подпрограмме формальные параметры заменяются на соответствующие по типу и категории фактические параметры вызывающей программы или подпрограммы. Параметры-значения. Формальные параметры-значения относятся к первой из перечисленных выше категорий и действуют как переменные, локальные по отношению к процедуре или функции. Изменения формальных параметров-значений не влияют на значения соответствующих фактических параметров. Синтаксис объявления параметра-значения следующий: •«Объявление параметра~значения> «Список идентификаторов>: «Тип параметра> «Тип параметра> ::= «Идентификатор типа> «Список илентификаторов> :| «Список идентификаторов:», «Идентификатор:» Фактический параметр, соответствующий параметру-значению в операторе процедуры или вызове функции, должен быть выражением, а его значение не может быть файлового типа. Фактический параметр должен быть совместим по присваиванию с типом формального параметра-значения. Рассмотрим пример объявления функции с параметром-значением: // Функция вычисления количества запятых в строке Function NmbComma( S: String ): Integer; Var i, L, Nmb :Integer; Begin Nmb := 0 ; L := Length(S); For i := 1 To L Do i If S[i] = Then inc(Nmb); NmbComma := Nmb; End; Параметры-переменные. Формальные параметры-переменные относятся ко второй категории параметров и служат для модификации внутри подпрограммы значений соответствующих фактических параметров. Формальный параметр-переменная представляет фактическую переменную во время выполнения процедуры или функции, поэтому все изменения значения формального параметра отражаются на фактическом параметре. Синтаксис объявления параметров-переменных следующий: •«Объявление параметров-переменных> ::= Var «Список идентификаторов:» : | Var Внутри подпрограммы любое упоминание формального параметра-переменной обеспечивает доступ к самому фактическому параметру. Тип фактического параметра должен быть тождественен типу формального параметра-переменной (это ограничение Можно обойти через использование параметров-переменных без типа).
Файловые типы могут передаваться только как параметры-переменные. Рассмотрим пример объявления процедуры с параметром-переменной: //Процедура замены запятых на точки с запятой в строке Procedure NmbComma(Var S: String); Var i, L:Integer; Begin L := Length(S); For i := 1 To L Do If S[i] = Then S[i] - *;'; End; В результате применения этой процедуры к строке S Sentence: NmbComma(S_Sentence); будет изменено содержимое строки. Если до вызова процедуры в строке находилось значение 'лимон, апельсин, банан', то после вызова процедуры значение S_Sentence будет равно 'лимон; апельсин; банан'. Как видно из синтаксической формулы, объявление параметров-переменных может не сопровождаться указанием типа. Когда формальный параметр является параметром-переменной без типа, соответствующий фактический параметр может быть переменной любого типа, а ответственность за правильность использования параметра ложится при этом на программиста. Внутри процедуры или функции такой параметр-переменная не имеет типа, то есть он не совместим с переменными всех других типов до тех пор, пока ему не присвоен определенный тип. Рассмотрим пример передачи параметров-переменных без типа: Function VarEqual(Var Source, Dest; EqSize: Word): Boolean; // Функция сравнения переменных Source и Dest длины EqSize Type ArrBytes = Array [0 .. 1000] Of Byte; // Объявление вспомогательного локального типа данных Var N: Integer; Begin N := 0; While (N < EqSize) And (ArrBytes(Dest)[N] = ArrBytes(Source)[N]) Do Inc(N); Equal := N = Size; End; Эту функцию можно использовать для сравнения любых двух переменных, размер которых не превышает 1000 байт. Например, в программе присутствуют следующие объявления: Туре TVector = Array[1 .. 10] Of Integer; TPoint = Record X, Y: Integer; End; Var Vectorl, Vector2: TVector; Pointl, Point2: TPoint; Тогда вызов функции: VarEqual(Vectorl, Vector2, SizeOf(Vector)) обеспечит сравнение массивов Vectorl и Vector2; VarEqual(Vectorl, Vector2, SizeOf(Integer)*10) — сравнение первых 10 элементов массивов Vectorl и Vector2; Equal (Pointl, Point2, SizeOf (TPoi’nt) ) — сравнение переменных Pointl и Point2; Equal(Vectorl[1], Point2.Y, SizeOf(Integer)) — Сравнение значений Vectorl [ 1 ] и Point2 .
У. Параметры-константы. Формальные параметры-константы Носят пограничный характер между двумя категориями. С одной Стороны, это параметры, которые передаются в подпрограмму по Наименованию, т. е. ссылкой на глобальное размещение фактического параметра, но, с другой стороны, внутри подпрограммы Действует запрет на изменение значения параметра. Использо- . |ать параметры-константы удобно вместо параметров-значений, j Ногда параметр характеризуется большим размером занимаемой Памяти. Параметры-константы введены в описание языка только Начиная с версии Turbo Pascal 7.0. Синтаксис объявления пара- МСтров-констант следующий: ::= Const: сСписок идентификаторов>:| Const сСписок идентификаторов> [4] Аналогично объявлению параметров-переменных в объявлении параметров-констант может отсутствовать указание типа. В этом случае фактический параметр может быть переменной любого типа, и использование его внутри подпрограммы предполагает предварительное преобразование к конкретному типу. 3.7.
<< | >>
Источник: О. Л. Голицына, Т. Л. Партыка, И. И. Попов. ЯЗЫКИ ПРОГРАММИРОВАНИЯ. 2008

Еще по теме Формальные и фактические параметры:

  1. § 3.4. Параметры социальной структуры организации
  2. Временные параметры вопроса
  3. Нормативная и фактическая структуры организации.
  4. ПАРАМЕТР
  5. Раздел XIII. Обязательства по оказанию фактических и юридических услуг
  6. 45. Структура и социально-психологические параметры малой группы
  7. Статья 904. Возмещение исполнителю фактических затрат по договору о безвозмездном предоставлении услуг
  8. Формальные причины
  9. Формальные группы.
  10. § 4.2. Формальные и неформальные группы
  11. ОПЕРАЦИЯ ФОРМАЛЬНАЯ
  12. РАЗДЕЛ 3. Формальные модели социальных процессов
  13. Раздел 3. Формальные модели социальных процессов
  14. Формальная теория доказательств.
  15. Соблюдение законов и норм формальной логики.
  16. ГРУППА ФОРМАЛЬНАЯ