- Фактический параметр
- Полезное
- Смотреть что такое «Фактический параметр» в других словарях:
- Подпрограммы
- 4.1 Общие сведения о подпрограммах. Локальные и глобальные переменные
- 4.2 Формальные и фактические параметры. Передача параметров в подпрограмму
- 4.3 Процедуры
- Формальные и фактические параметры
- Статьи к прочтению:
- Ээ в этом случае наши полномочия все окончены
- Похожие статьи:
- Функции и процедуры. Рекурсия
- Теоретический материал (Паскаль)
- Понятие подпрограммы. Процедуры и функции. Стандартные подпрограммы
- TURBO PASCAL
- Описания процедур
- Описания функций
- Параметры
- Параметры-значения
- Параметры-константы
- Параметры-переменные
- Нетипизированные параметры
- Открытые параметры
- Открытые строковые параметры
- Открытые параметры-массивы
Фактический параметр
29. Фактический параметр
Языковый объект, который появляется в вызове процедуры и связывается с соответствующим формальным параметром процедуры для использования при ее выполнении
Полезное
Смотреть что такое «Фактический параметр» в других словарях:
Фактический параметр — переменная или ее значение, подставленные при использовании подпрограмм вместо формального параметра. См. также: Подпрограммы Финансовый словарь Финам … Финансовый словарь
фактический параметр — Языковый объект, который появляется в вызове процедуры и связывается с соответствующим формальным параметром процедуры для использования при ее выполнении. [ГОСТ 28397 89] Тематики языки программирования EN (actual) argumentactual parameter … Справочник технического переводчика
Параметр (программирование) — У этого термина существуют и другие значения, см. Параметр (значения). Параметр в программировании принятый функцией аргумент. Термин «аргумент» подразумевает, что конкретно и какой конкретной функции было передано, а параметр в каком качестве… … Википедия
Подпрограмма — (англ. subroutine) поименованная или иным образом идентифицированная часть компьютерной программы, содержащая описание определённого набора действий. Подпрограмма может быть многократно вызвана из разных частей программы. В языках… … Википедия
Процедура (программирование) — Подпрограмма (англ. subprogram) поименованная или иным образом идентифицированная часть компьютерной программы, содержащая описание определённого набора действий. Подпрограмма может быть многократно вызвана из разных частей программы. В языках… … Википедия
ГОСТ 28397-89: Языки программирования. Термины и определения — Терминология ГОСТ 28397 89: Языки программирования. Термины и определения оригинал документа: 38. Автоматическое распределение памяти Automatic storage allocation Выделение памяти при входе в программный блок для локальных переменных и ее… … Словарь-справочник терминов нормативно-технической документации
Обобщенное программирование — Обобщённое программирование парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. В том или ином виде поддерживается разными языками… … Википедия
Парадигма — (Paradigm) Определение парадигмы, история возникновения парадигмы Информация об определении парадигмы, история возникновения парадигмы Содержание Содержание История возникновения Частные случаи (лингвистика) Управленческая парадигма Парадигма… … Энциклопедия инвестора
Обобщённое программирование — (англ. generic programming) парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. В том или ином виде поддерживается разными… … Википедия
Haskell — Класс языка: функциональный, ленивый, модульный Тип исполнения: компилируемый, интерпретируемый Появился в: 1990 … Википедия
Подпрограммы
В практике программирования часто складываются ситуации, когда одну и ту же группу операторов, реализующих определённую цель, требуется повторить без изменений в нескольких местах программы. Для избавления от столь нерациональной траты времени была предложена концепция подпрограммы.
4.1 Общие сведения о подпрограммах. Локальные и глобальные переменные
Для правильного определения области действия идентификаторов (переменных) необходимо придерживаться следующих правил:
4.2 Формальные и фактические параметры. Передача параметров в подпрограмму
Обмен информацией между вызываемой и вызывающей функциями осуществляется с помощью механизма передачи параметров. Переменные, указанные в списке в заголовке функции, называются формальными параметрами, или просто параметрами подпрограммы. Все переменные из этого списка могут использоваться внутри подпрограммы. Список переменных в операторе вызова подпрограммы — это фактические параметры, или аргументы.
Механизм передачи параметров обеспечивает обмен данных между формальными и фактическими параметрами, что позволяет выполнять подпрограмму с различными данными. Между фактическими параметрами в операторе вызова и формальными параметрами в заголовке подпрограммы устанавливается взаимно однозначное соответствие. Количество, типы и порядок следования формальных и фактических параметров должны совпадать.
Формальные параметры процедуры можно разделить на два класса: параметры-значения и параметры-переменные.
При передаче данных через параметры-значения в подпрограмму передаются значения фактических параметров, и доступа к самим фактическим параметрам из подпрограммы нет. При передаче данных параметры-переменные заменяют 1 Реально в подпрограмму передаются адреса фактических параметров. формальные параметры, и, следовательно, в подпрограмме есть доступ к значениям фактических параметров. Любое изменение параметров-переменных в подпрограмме приводит к изменению соответствующих им формальных параметров. Следовательно, входные данные следует передавать через параметры-значения, для передачи изменяемых в результате работы подпрограммы данных следует использовать параметры-переменные.
От общетеоретических положений перейдём к практическому использованию подпрограмм при решении задач. Изучение подпрограмм начнем с процедур.
4.3 Процедуры
Описание процедуры имеет вид:
procedure name_1( r : real; i : integer; c : char );
Однотипные параметры могут быть перечислены через запятую:
procedure name_2( a, b : real; i, j, k : integer );
Список формальных параметров необязателен и может отсутствовать:
Если в заголовке процедуры будут применяться параметры-переменные, то перед ними необходимо указывать служебное слово var :
procedure name_4( x, y : real; var z : real );
Для обращения к процедуре необходимо использовать оператор вызова:
Фактические параметры в списке оператора вызова отделяются друг от друга запятой:
a : = 5. 3; k : = 2; s := ’ a ’;
Если в описании процедуры формальные параметры отсутствовали, то и при вызове их быть не должно:
Алгоритм решения этой задачи был подробно описан в задаче 3.3 (рис. 3.14). Однако там не была рассмотрена ситуация некорректного ввода значений коэффициентов. Например, если пользователь введёт , то уравнение из квадратного превратится в линейное. Алгоритм решения линейного уравнения тривиален:
, при условии, что
. Чтобы не усложнять уже составленный алгоритм решения квадратного уравнения, запишем его в виде подпрограммы-процедуры. Далее приведён фрагмент программы с комментариями:
Формальные и фактические параметры
Рассмотрим более подробно вопросы взаимодействия формальных и фактических параметров.
Определения формальных и фактических параметров являются исключительно важными для понимания механизма их взаимодействия в подпрограммах. Поэтому на этом вопросе следует остановиться подробнее.
Формальные параметры подпрограммы указывают, с какими параметрами следует обращаться к этой подпрограмме (количество параметров, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка формальных параметров, разбитого на группы, разделенные точками с запятыми. В группу формальных параметров включаются однотипные параметры одной категории.
Все формальные параметры можно разбить на четыре категории:
— параметры-значения (эти параметры подпрограмма может изменить в основной подпрограмме);
— параметры-переменные (эти параметры подпрограмма может изменить в основной программе);
— параметры-константы (только в версии 7.0);
— параметры-процедуры и параметры-функции (т.е. процедурного типа).
Для каждого формального параметра следует указать имя и, как правило, тип, а в случае параметра-переменной или параметра-константы — категорию. Имена параметров могут быть любыми, в том числе и совпадать с именами объектов программы. Необходимо лишь помнить, что в этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Тип формального параметра может быть практически любым, однако в заголовке подпрограммы нельзя вводить новый тип.
Например, нельзя писать
Function SUMM (A: array[1..100] of Real): Real;
Чтобы правильно записать этот заголовок, следует в основной программе ввести тип-массив, а затем использовать его в заголовке:
Type aArr = array[1..100] of real;
Function SUMM (A: aArr): Real;
При обращении к подпрограмме формальные параметры заменяются на соответствующие фактическиевызывающей программы или подпрограммы.
Параметры-значения передаются основной программой в подпрограмму через стек (специальный канал передачи данных) в виде их копий и, следовательно, собственный параметр программы подпрограммой измениться не может.
Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие — типом. Тип параметра-значения может быть любым, за исключением файлового.
Если параметров-значений одного типа несколько, их можно объединить в одну группу, перечислив их имена через запятую, а затем уже указать общий тип. Как было отмечено выше, отдельные группы параметров отделяются друг от друга точкой с запятой.
Procedure MIN_MAX(Max,Min: Real; n: Word);
Function Tabulir(X,Y: Integer): Real;
В качестве фактического параметра на месте параметра-значения при вызове подпрограммы может выступать любое выражение совместимого для присваивания типа, не содержащее файловую компоненту, например:
Пример 2.6.Использовать функцию для вычисления максимального элемента в массиве.
Определим в основной программе тип-массив.
aArr = Array[1..] of Integer;
Var Massiv: aArr; Maxim: Integer;
Функция в этом случае может иметь следующий вид.
Function Max(Mas: aArr; N: Byte): Integer;
Var Ma : Integer; i : Byte;
If MaMas[i] then Ma := Mas[i];
Пусть надо определить максимальное число из первых 35 чисел массива. Это можно сделать с помощью оператора, использующего обращение к функции: Maxim := Max(Massiv,35);
Примечание. Данная программа может работать только с массивами типа аАrr. Для массивов другого типа надо создавать другую аналогичную подпрограмму. Данная программа создает в стеке копию исходного массива, поэтому она работает медленно.
Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово VAR. Действие слова VAR распространяется до ближайшей точки с запятой, т.е. в пределах одной группы.
Пример 2.8. Procedure MaxMin(A: аАrr; Var Max, Min: Real; N: Word);
Здесь Max, Min- параметры-переменные, а переменные А и N — параметры-значения.
Тип параметров-переменных может быть любым, включая и файловый. При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра должна использоваться переменная идентичного типа. Так, если формальный параметр имеет тип, определенный следующим образом:
Type аАrr = array [1.. 100] of Integer;
то и фактический параметр должен быть переменной или типизированной константой типа аАrr.
Использовать функцию для вычисления максимального элемента в массиве.
В основной программе определяется тип-массив.
Type аАrr = Array [1.. 50] of Integer;
Var Massiv: аАrr; Maxim: Integer;
Функция в этом случае может иметь вид:
Function Max(Var Mas: аАгг; N: Byte): Integer;
Var Ma : Integer; i : Byte;
If MaMas[i] then Ma := Mas[i];
Пусть надо определить максимальное число из первых 35 чисел массива Это можно сделать с помощью оператора:
Примечание. Эта программа лучше предыдущей тем, что в данном случае в стеке не создается копия исходного массива, что улучшает быстродействие и экономит память. Однако при такой передаче параметра возможно его нежелательное изменение (этот вариант передачи параметра допустим только в таких небольших подпрограммах, как в данном случае, когда программист может проконтролировать несанкционированное изменение параметра). Недостатком этой программы, как и ранее описанной, является то, что она может работать только с одним типом массива.
Часто в качестве параметра в подпрограмму следует передать ту или иную переменную, но изменять ее подпрограмма не должна. В этом случае нежелательно передавать этот параметр как параметр-переменную. Можно его передать как параметр-значение, однако если эта переменная имеет больший размер (массив, запись и т.д.), то копия этого параметра займет большую часть стека и даже может его переполнить. Это приводит также к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурированного типа, передается своим адресом, но предусматривается защита от его изменения. Использовать параметр-константу можно только в версии Турбо Паскаля 7.0.
Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается зарезервированное слово Const. Действие слова Const распространяется до ближайшей точки с запятой, т.е. в пределах одной группы.
Пример 2.10.Function NewString(Const S: String): String;
Тип параметра-значения может быть любым, за исключением файлового. При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра можно использовать любое выражение совместимого для присваивания типа, не содержащего файловую компоненту.
Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра.
Функция вычисления максимального элемента в массиве, и в качестве первого параметра – параметр-константа.
Function Max(Const Mas: аАrr; N: Byte): Integer;
Var Ma : Integer; i : Byte;
If MaMas[i] then Ma := Mas[i];
Параметры без типа
В Турбо Паскале можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа,а ответственность за правильное использование того или иного параметра возлагается на программиста.
Пример 2.12.Function Tqual(Var Param1, Param2; Len: Word):Boolean;
Здесь Param1, Param2 — параметры-переменные без типа (вместо них можно использовать, например, любые переменные простого типа, типа-массив, типа-запись и т.д.); Len — параметр-значение.
Следует иметь в виду, что параметр “без типа” внутри подпрограммы типа не имеет и его перед использованием следует преобразовать к конкретному типу, применяя идентификатор соответствующего типа так, как ранее указывалось, при этом полученный результат может быть любого размера.
Пример 2.13.Функция вычисления максимального элемента в массиве. При этом в качестве первого параметра используется параметр-переменная без типа:
Function Max(Var Masr; N: Byte): Integer;
Type aArray = array[Maxint] of Integer;
Var Ма : Integer; i : Byte;
Begin Ма := aArray(Mas)[1];
If МаaArray(Mas)[i] then Ма := aArray(Mas)[i];
В этом случае в качестве первого передаваемого параметра можно использовать любой массив (и не только массив), так что подпрограмма становится более универсальной. Тем не менее здесь необходимо передавать в качестве второго параметра фактический размер информации, что не очень удобно.
Статьи к прочтению:
Ээ в этом случае наши полномочия все окончены
Похожие статьи:
Лабораторная работа №3 Использование подпрограмм в системе MATLAB Цель работы: Знакомство с организацией функций в MATLAB, особенностями их работы….
Существует несколько способов передачи параметров в подпрограмму. § Передача параметров по значению. Формальному параметру присваивается значение…
Функции и процедуры. Рекурсия
Теоретический материал (Паскаль)
Понятие подпрограммы. Процедуры и функции. Стандартные подпрограммы
Подпрограммы решают три важные задачи:
Очень важно понимать, что в подпрограмму может выделяться любой законченный фрагмент программы. В качестве ориентиров просмотрите следующие рекомендации:
Подпрограммы могут быть стандартными, т.е. определенными системой, и собственными, т.е. определенными программистом.
Из набора стандартных процедур и функций по обработке одного типа информации составляются модули. Каждый модуль имеет своё имя (мы уже хорошо знакомы с модулями Crt, Graph). Доступ к процедурам и функциям модуля осуществляется при подключении этого модуля (Uses Crt, Graph).
Задание. Вызовите помощь по функции Cos и рассмотрите предоставленную информацию.
Сначала идет краткое описание подпрограммы (в одну фразу). Далее под словом Declaration (Объявление) следует интерфейсная часть процедуры или функции, которая необходима для определения типов фактических параметров. Далее под словом Target приводятся платформы, на которых может использоваться подпрограмма: Windows, real (реальный режим DOS), protected (защищенный режим DOS). После слова Remarks следуют заметки, содержащие необходимые детали использования. В разделе See Also приведены имена подпрограмм, связанных с данной по смыслу или по совместному применению. Если перемещать курсор по этим именам (они выделяются подсветкой), то, выбрав одно из них (нажав клавишу ), можно получить справку по следующей подпрограмме. Каждая процедура и функция сопровождается примером применения, переключение к которому дает последняя строка справочной информации. Любой текст из Help может быть скопирован в редактируемый файл обычными приемами копирования через буфер. Копирование примеров или заголовков функций может значительно облегчить работу.
Существует другой способ получения сведений о процедурах и функциях. Для этого нужно использовать пункт меню Help/Reserved words (зарезервированные слова) или Help/Standard units (стандартные модули).
Задание. Рассмотрите список процедур и функций, выберите какие-либо из них и ознакомьтесь со справочной информацией.
В стандартных модулях содержится большое количество подпрограмм, но невозможно создать модуль, который бы содержал все нужные программисту подпрограммы. Поэтому большую роль играют собственные подпрограммы, которые создает программист для решения конкретной задачи.
Существует два способа объединения программ и подпрограмм пользователя:
Первый способ применяется тогда, когда программа в целом не очень большая, а ее подпрограммы, скорее всего, не будут использоваться в других программах.
Структура текста подпрограммы соответствует структуре текста основной программы за двумя исключениями:
Вызов подпрограммы происходит при каждом употреблении ее имени в основной (или вызывающей) программе. При вызове подпрограммы выполнение основной программы приостанавливается, и управление передается в подпрограмму, где выполняются команды, заданные в ней. Подпрограмма завершается, если выполнены все ее операторы до завершающего слова End или по специальной команде выхода из подпрограммы Exit. По окончании работы подпрограммы управление возвращается основной программе, а именно, первой команде, следующей за обращением к этой подпрограмме.
Например, вызов функции
вернет в основную программу значение наименьшего из двух чисел и это значение будет присвоено переменной M.
Все переменные, которые использует подпрограмма, могут быть либо глобальными, либо локальными.
Определение. Глобальными называются переменные, объявленные в основной программе и доступные как программе, так и всем ее подпрограммам.
Определение. Локальными называются переменные, объявленные внутри подпрограммы и доступные только ей самой.
Обмен информацией между основной программой и подпрограммой может осуществляться только с помощью глобальных переменных и с помощью параметров подпрограммы.
Подпрограмма может использовать любые глобальные переменные кроме тех, которые имеют те же имена, что и ее локальные переменные. Если в подпрограмме описана локальная переменная, имя которой совпадает с именем некоторой глобальной переменной, то данная глобальная переменная становится недоступной в этой подпрограмме, и при указании идентификатора переменной произойдет обращение к локальной переменой подпрограммы, а не одноименной глобальной переменной. Память для локальных (т.е. описанных в подпрограмме) переменных выделяется на время исполнения данной подпрограммы в специальной области, называемой стеком. При завершении работы подпрограммы память освобождается, поэтому все внутренние результаты работы подпрограммы не сохраняются от одного обращения к другому.
Если говорить о плюсах использования подпрограмм, то можно назвать следующие:
В языке Паскаль выделяют два вида подпрограмм: процедуры (Procedure) и функции (Function). Любая программа может содержать несколько процедур и функций. Структура любой подпрограммы аналогична структуре всей программы.
Подпрограмма должна быть описана до того, как будет использована в программе или другой подпрограмме.
Процедуры и функции объявляются в разделе описания вслед за разделом переменных.
Общая структура программы выглядит так:
Выполнение программы начинается с операторов основной программы. При необходимости вызывается подпрограмма, и начинают действовать её операторы. Затем управление возвращается в основную программу, которая и продолжает выполняться.
Подпрограмма вызывается по своему имени с указанием необходимых параметров.
На этом занятии рассмотрим примеры организации наиболее простого вызова подпрограмм.
Задание. Рассмотрите решение предложенных задач, наберите программы на компьютере, проверьте их работоспособность, внесите свои изменения и дополните своими комментариями.
Задача 1. Написать программу, состоящую из трех подпрограмм и основной программы. Подпрограммы должны организовывать ввод чисел, вычисление их суммы и вывод результата.
Задача 2. Найти среднее арифметическое двух чисел.
TURBO PASCAL
Процедуры и функции позволяют включать в основной программный блок дополнительные блоки. Каждое описание процедуры или функции содержит заголовок, за которым следует программный блок. Процедура активизируется с помощью оператора процедуры. Функция активизируется при вычислении выражения, содержащего вызов функции, и возвращаемое функцией значение подставляется в это выражение.
Примечание: Определение блока вы можете найти в Главе 8 «Блоки, локальность и область действия».
В данной главе обсуждаются различные способы описания процедуры или функции и их параметры.
Описания процедур
Описание процедуры позволяет связать идентификатор с процедурным блоком. Процедуру можно затем активизировать с помощью оператора процедуры.
Заголовки процедур именуют идентификаторы процедур и задают формальные параметры (если они имеются).
Примечание: Синтаксис списка формальных параметров показан далее в этой главе в разделе «Параметры».
Процедура активизируется с помощью оператора процедуры, в котором содержатся имя процедуры и необходимые параметры. Операторы, которые должны выполняться при запуске процедуры, содержатся в операторной части модуля процедуры. Если в содержащемся в процедуре операторе внутри модуля процедуры используется идентификатор процедуры, то процедура будет выполняться рекурсивно (будет при выполнении обращаться сама к себе).
Приведем пример описания процедуры:
procedure NumString(N: integer; var S: string);
S := Chr(N mod 10 + Ord(‘0’)) + S; N := N div 10;
Описания функций
Описание функции определяет часть программы, в которой вычисляются и возвращается значение.
Примечание: Функция не может возвращать процедурный тип или структурный тип.
В заголовке функции определяется идентификатор функции, формальные параметры (если они имеются) и тип результата функции.
Функция активизируется при вызове функции. При вызове функции указывается идентификатор функции и какие-либо параметры, необходимые для вычисления функции. Вызов функции может включаться в выражения в качестве операнда. Когда выражение вычисляется, функция выполняется и значением операнда становится значение, возвращаемое функцией.
В операторной части блока функции задаются операторы, которые должны выполняться при активизации функции. В модуле должен содержаться по крайней мере один оператор присваивания, в котором идентификатору функции присваивается значение. Результатом функции является последнее присвоенное значение. Если такой оператор присваивания отсутствует или он не был выполнен, то значение, возвращаемое функцией, не определено.
Если идентификатор функции используется при вызове функции внутри модуля-функции, то функция выполняется рекурсивно.
Приведем далее примеры описаний функции:
function Max(a: Vector; n: integer): extended;
for i := 2 to n do if x
function Power(x: extended; y: integer): extended;
if Odd(i) then z := z*x;
Аналогично процедурам функции могут описываться, как с ближним типом вызова (near), с дальним типом вызова (far), опережающие (forward), внешние (external), ассемблерные (assembler) или подставляемые (inline). Однако функции прерываний (interrupt) не допускаются.
Параметры
В описании процедуры или функции задается список формальных параметров. Каждый параметр, описанный в списке формальных параметров, является локальным по отношению к описываемой процедуре или функции и в модуле, связанным с данной процедурой или функцией на него можно ссылаться по его идентификатору.
Существует три типа параметров: значение, переменная и нетипизированная переменная. Они характеризуются следующим:
1. Группа параметров без предшествующего ключевого слова является списком параметров-значений.
2. Группа параметров, перед которыми следует ключевое слово const и за которыми следует тип, является списком параметров-констант.
3. Группа параметров, перед которыми стоит ключевое слово var и за которыми следует тип, является списком типизированных параметров-переменных.
4. Группа параметров, перед которыми стоит ключевое слово var или const за которыми не следует тип, является списком нетипизированных параметров-переменных.
Примечание: Подробнее об открытых параметрах рассказывается ниже.
Параметры-значения
Формальный параметр-значение обрабатывается, как локальная по отношению к процедуре или функции переменная, за исключением того, что он получает свое начальное значение из соответствующего фактического параметра при активизации процедуры или функции. Изменения, которые претерпевает формальный параметр-значение, не влияют на значение фактического параметра.
Соответствующее фактическое значение параметра-значения должно быть выражением и его значение не должно иметь файловый тип или какой-либо структурный тип, содержащий в себе файловый тип.
Фактический параметр должен иметь тип, совместимый по присваиванию с типом формального параметра-значения. Если параметр имеет строковый тип, то формальный параметр будет иметь атрибут размера, равный 255.
Параметры-константы
Формальные параметры-константы работают аналогично локальной переменной, доступной только по чтению, которая получает свое значение при активизации процедуры или функции от соответствующего фактического параметра. Присваивания формальному параметру-константе не допускаются. Формальный параметр-константа также не может передаваться в качестве фактического параметра другой процедуре или функции.
Параметр-константа, соответствующий фактическому параметру в операторе процедуры или функции, должен подчиняться тем же правилам, что и фактическое значение параметра.
В тех случаях, когда формальный параметр не изменяет при выполнении процедуры или функции своего значения, вместо параметра-значения следует использовать параметр-константу. Параметры-константы позволяют при реализации процедуры или функции защититься от случайных присваиваний формальному параметру. Кроме того, для параметров структурного и строкового типа компилятор при использовании вместо параметров-значений параметров-констант может генерировать более эффективный код.
Параметры-переменные
Параметр-переменная используется, когда значение должно передаваться из процедуры или функции вызывающей программе. Соответствующий фактический параметр в операторе вызова процедуры или функции должен быть ссылкой на переменную. При активизации процедуры или функции формальный параметр-переменная замещается фактической переменной, любые изменения в значении формального параметра-переменной отражаются на фактическом параметре.
Внутри процедуры или функции любая ссылка на формальный параметр-переменную приводит к доступу к самому фактическому параметру. Тип фактического параметра должен совпадать с типом формального параметра-переменной (вы можете обойти это ограничение с помощью нетипизированного параметра-переменной).
Примечание: Файловый тип может передаваться только, как параметр-переменная.
При ссылке на фактический параметр-переменную, связанную с индексированием массива или получением указателя на объект, эти действия выполняются перед активизацией процедуры или функции.
Правила совместимости по присваиванию для объектного типа применяются также к параметрам-переменным объектного типа. Для формального параметра типа T1 фактический параметр должен быть типа T2, если T2 находится в домене T1. Например, с учетом описаний Главы 4, методу TField.Copy может передаваться экземпляр TField, TStrField, TNumField, TZipField или любой другой экземпляр потомка TField.
Нетипизированные параметры
Когда формальный параметр является нетипизированным параметром-переменной, то соответствующий фактический параметр может представлять собой любую ссылку на переменную или константу, независимо от ее типа. Нетипизированный параметр, описанный с ключевым словом var, может модифицироваться, а нетипизированный параметр, описанный с ключевым словом const, доступен только по чтению.
В процедуре или функции у нетипизированного параметра-переменной тип отсутствует, то есть он несовместим с переменными всех типов, пока ему не будет присвоен определенный тип с помощью присваивания типа переменной.
Приведем пример нетипизированных параметров-переменных:
function Equal(var source,dest; size: word): boolean;
Bytes = array[0..MaxInt] of byte; var
while (N Bytes(source)[N]
Equal := N = size; end;
Эта функция может использоваться для сравнения любых двух переменных любого размера. Например, с помощью описаний:
Vector = array[1..10] of integer;
сравнивается Vес1 с Vес2, сравниваются первые N элементов Vес1 с
первыми N элементами Vес2, сравниваются первые 5 элементов Vес1 с
последними пятью элементами Vес2 и сравниваются Vес1[1] с Р.х и
Хотя нетипизированные параметры дают вам большую гибкость, их использование сопряжено с некоторым риском. Компилятор не может проверить допустимость операций с нетипизированными переменными.
Открытые параметры
Открытые параметры позволяют передавать одной и той же процедуре или функции строки и массивы различных размеров.
Открытые строковые параметры
Открытые строковые параметры могут описываться двумя способами:
· с помощью идентификатора OpenString;
Идентификатор OpenString описывается в модуле System. Он обозначает специальный строковый тип, который может использоваться только в описании строковых параметров. В целях обратной совместимости OpenString не является зарезервированным словом и может, таким образом, быть переопределен как идентификатор, заданный пользователем.
Для открытого строкового параметра фактический параметр может быть переменной любого строкового типа. В процедуре или функции атрибут размера (максимальная длина) формального параметра будет тем же, что у фактического параметра.
Открытые строковые параметры ведут себя также как параметры-переменные строкового типа, только их нельзя передавать как обычные переменные другим процедурам или функциям. Однако, их можно снова передать как открытые строковые параметры.
procedure AssignStr(var S: OpenString;
S := ‘0123456789ABCDEF’; end;
AssignStr(S1); S1 := ‘0123456789’
AssignStr(S2); S2 := ‘0123456789ABCDEF’
В AssingStr максимальная длина параметра S та же самая, что у фактического параметра. Таким образом, в первом вызове AssingStr при присваивании параметра S строка усекается, так как максимальная длина S1 равна 10.
При применении к открытому строковому параметру стандартная функция Low возвращает 0, стандартная функция High возвращает описанную максимальную длину фактического параметра, а функция SizeOf возвращает размер фактического параметра.
В следующем примере процедура FillString заполняет строку заданным символом до ее максимальной длины. Обратите внимание на использование функции High для получения максимальной длины открытого строкового параметра.
procedure FillStr(var S: OpenString; Ch: Char);
S[0] := Chr(High(S)); задает длину строки
FillChar(S[1], High(S), Ch); устанавливает число символов
Открытые параметры-массивы
Формальный параметр, описанный с помощью синтаксиса:
является открытым параметром-массивом. T должно быть идентификатором типа, а фактический параметр должен быть переменной типа T, или массивом, типом элементов которого является T. В процедуре или функции формальный параметр ведет себя так, как если бы он был описан следующим образом:
К открытому формальному параметру-массиву можно обращаться только по элементам. Присваивания всему открытому массиву не допускаются, и открытый массив может передаваться другим процедурам или функциям только как открытый параметр-массив или нетипизированный параметр-переменная.
Открытый параметр-массив может быть параметром-значением, параметром-константой и параметром-переменной и имеет тот же смысл, что и обычные параметры-значения, параметры-константы и параметры-переменные. В частности, присваивания элементам формального открытого массива-константы не допускаются, а присваивания элементам формального открытого массива, являющегося параметром-значением, не влияют на фактический параметр.
Для открытых массивов-значений компилятор создает в кадре стека процедуры или функции локальную копию фактического параметра. Таким образом, при передаче в качестве открытых параметров-значений больших массивов следует учитывать возможное переполнение стека.
При применении к открытому параметру-массиву стандартная функция Low возвращает 0, стандартная функция High возвращает индекс последнего элемента в фактическом параметре-массиве, а функция SizeOf возвращает размер фактического параметра-массива.
Процедура Clear в следующем примере присваивает каждому элементу массива вещественных значений ноль, а функция Sum вычисляет сумму всех элементов массива вещественных чисел. Поскольку в обоих случаях параметр A является открытым параметром-массивом, подпрограммы могут работать с любым массивом элементов типа Real:
procedure Clear(var A: array of Real);
for I := 0 to High(A) do A[I] := 0; end;
function Sum(const A: array of Real): Real;
for I := 0 to High(A) do S := S + A[I];
Когда типом элементов открытого параметра-массива является Char, фактический параметр может быть строковой константой. Например, с учетом предыдущего описания:
procedure PringStr(const S: array of Char);
for I := 0 to High(S) do
if S[I] <> #0 then Write(S[I]) else Break;
и допустимы следующие операторы процедур:
При передаче в качестве открытого параметра-массива пустая строка преобразуется в строку с одним элементом, содержащим символ NULL, поэтому оператор PrintStr(») идентичен оператору PrintStr(‘#0’).
(с) Все права защищены.
По всем интересующим вопросам прошу писать электронный адрес