Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Механизм передачи параметров




Как было показано в приведенных выше примерах программ с использованием процедур и функций, в заголовке процедуры или функции может быть задан спи­сок параметров, которые называются формальными. Название "формальные" эти параметры получили в связи с тем, что в этом списке заданы только имена для обо­значения исходных данных и результатов работы процедуры, а при вызове подпро­граммы на их место будут подставлены конкретные значения (выражений) и имен. Этот список указывается после имени подпрограммы и заключается в круглые скобки.

Список формальных параметров, указываемых в заголовке подпрограммы, мо­жет включать в себя:

• параметры-значения;

• параметры-переменные, перед которыми должно стоять служебное слово var
и за которыми указывается их тип;

 

• параметры-процедуры, перед которыми должно стоять служебное слово
procedure;

• параметры-функции, перед которыми должно стоять служебное слово
function и после которых указывается тип значения, возвращаемого функцией в ос­
новную программу;

• нетипизированные параметры, перед которыми должно стоять служебное
слово var и отсутствует указание типа.

В списке должны быть перечислены имена формальных параметров и их типы. Имя параметра отделяется от типа двоеточием, а параметры друг от друга — точ­кой с запятой. Имена параметров одного типа можно объединять в подсписки, в которых имена отделяются друг от друга запятой.

Примеры заголовков:

Между формальными и фактическими параметрами должно быть полное соот­ветствие:

• формальных и фактических параметров должно быть одинаковое количество;

• порядок следования фактических и формальных параметров должен быть
один и тот же;

• тип каждого фактического параметра должен совпадать с типом соответст­
вующего формального параметра.

Параметры-значения. Параметры-значения используются только для переда­чи исходных данных из основной программы в подпрограмму (процедуру или функцию), в списке формальных параметров они перечисляются через запятую с обязательным указанием их типов, как было, например, в выше приведенных при­мерах:

procedure Abort(Msg: string);

function Step(N: integer; X: real): real;

Если формальный параметр объявлен как параметр-значение, то фактическим параметром может быть произвольное выражение. При вызове подпрограммы фак­тические параметры вычисляются и используются как начальные значения фор­мальных параметров, т. е. осуществляется подстановка значений. Если формаль­ный параметр определен как параметр-значение, то перед вызовом процедуры это значение вычисляется, полученный результат помещается во временную память и передается процедуре. Даже если фактический параметр — простейшее выраже­ние в виде константы или переменной, все равно процедуре будет передана лишь копия этой константы (переменной). В процессе выполнения подпрограммы фор­мальные параметры могут изменяться, но это никак не отразится на соответствую­щих фактических параметрах-переменных, которые сохранят те значения, которые имели до вызова подпрограммы, так как меняются не они, а их копия. Поэтому па­раметры-значения нельзя использовать для передачи результатов из подпрограммы в основную программу.

Пример программы с использованием передачи параметров по значению:

При вызове процедуры Sum_Square с фактическими параметрами А, В значе­ния этих параметров (один раз) копируются в соответствующие формальные пара­метры X, Y, и дальнейшие преобразования формальных параметров X,Y внутри процедуры Sum_Square уже никак не влияют на значения переменных А, В.

Упражнение 3. Запустите интегрированную среду программирования. Введите текст программы Par_Znach, запишите файл на диск под соответствующим именем, а затем от­компилируйте его. После того как компиляция выполнится успешно, задайте для просмот­ра в окне отладчика величины А, В, X, Y. Установите видимыми одновременно окно редак­тора с текстом программы и окно просмотра. Исполните программу в пошаговом режиме с заходом в процедуру и пронаблюдайте за изменениями значений переменных в основной программе и в процедуре, обратите внимание на передачу значений при вызове процедуры ее формальным параметрам, а также на то, что в процессе выполнения процедуры и по ее окончании значения переменных А, В не изменялись.

Параметры-переменные. Параметры-переменные используются для опреде­ления результатов выполнения процедуры и в списке формальных параметров пе­речисляются после зарезервированного слова var с обязательным указанием типа. Каждому формальному параметру, объявленому как параметр-переменная, должен соответствовать фактический параметр в виде переменной соответствующего ти­па, например:

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

Пример программы, использующей параметры-переменные:

Упражнение 4. Запустите интегрированную среду программирования. Введите текст программы Sum_Sub_Square и запишите файл на диск под соответствующим именем, а за­тем откомпилируйте его. После того как компиляция выполнится успешно, задайте для про­смотра в окне отладчика величины А, В, Sum, Sub, SumAB, SubAB. Установите видимыми одновременно окна редактора с текстом программы и окно просмотра. Исполните програм­му в пошаговом режиме с заходом в процедуру и пронаблюдайте за изменениями значений переменных в основной программе и в процедуре, обратив внимание на передачу значений при вызове процедуры ее формальным параметрам, а также на то, что значения переменных SumAB и SubAB в основной программе изменялись в процессе выполнения процедуры.

Параметры-процедуры и параметры-функции. В качестве расширения стандартного Паскаля, Турбо Паскаль позволяет рассматривать процедуры и функции как объекты, которые можно присвоить переменным и которые могут вы­ступать в качестве параметров; процедурные типы делают это возможным.

Как только процедурный тип определен, можно объявлять переменные этого типа. Такие переменные называются процедурными переменными. Они могут быть использованы в качестве формальных параметров при вызове процедур и функций. Подобно тому, как целочисленной переменной можно присвоить цело­численное значение, процедурной переменной можно присвоить процедурное зна­чение. Такое значение может, конечно, быть и другой процедурной переменной, но может также §ыть идентификатором процедуры или функции. В этой ситуации объявление процедуры или функции можно рассматривать как особый вид объяв­ления константы, значением которой является процедура или функция.

Как и во всех других операциях присваивания, переменная в левой части и переменная в правой части оператора присваивания должны быть совместимы­ми по присваиванию. Для того чтобы считаться совместимыми по присваиванию, процедурные типы должны иметь одинаковое число параметров, параметры в со­ответствующих позициях должны быть тождественных типов; наконец, типы ре­зультатов функций должны быть идентичны. Дополнительно к совместимости ти­пов процедура или функция должны удовлетворять следующим требованиям, если они присваиваются процедурной переменной.

• Они должны быть объявлены с директивой far (использование дальнего типа
зызова подпрограмм) и откомпилированы в состоянии {$F+};

• Они не должны быть:

стандартной процедурой или функцией;

вложенной процедурой или функцией;

inline процедурой или функцией;

interrupt процедурой или функцией.

При использовании параметров-процедур или параметров-функций в списке ~еред соответствующими формальными параметрами указывается зарезервирован- ~*ое слово procedure или function, например:

В списке формальных параметров процедуры Exampl:

К, L — параметры-значения;

М — параметр-переменная;

Prob — параметр-процедура;

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

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

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

Примечание. {$F+} — указание (директива) компилятору Турбо Паскаль на использо­вание дальнего (far) типа вызова для корректной обработки вызова процедуры Туре_ТаЫ с параметрами-функциями.

В данной программе процедура Туре_ТаЫ представляет собой общее действие, выполняемое над параметрами-функциями Add, Mult, Funny. После запуска про­граммы сначала вызывается процедура Туре_ТаЫ для фактических параметров 10, 10 и Add, в результате чего формальным параметрам X и Y присваиваются значе­ния чисел 10 и 10, а формальному параметру Operation процедурного типа Func присваивается имя фактической функции Add. В результате этого на экран будет

•введена таблица сложения от 1 до 10. Затем процедура Туре_ТаЫ вызывается к -слолнению для фактических параметров 10, 10 и параметра-функции Mult, в ре-:;-льтате чего на экран будет выведена таблица умножения от 1 до 10. Аналогично = ызов процедуры Туре_ТаЫ с параметрами 10, 10 и Funny даст в результате на эк- -~-не таблицу произведения суммы на разность чисел от 1 до 10.

Упражнение 5. Запустите интегрированную среду программирования. Введите текст тгограммы Demo_Tabl и запишите файл на диск под соответствующим именем, а затем от-v змпилируйте его. После того как компиляция выполнится успешно, исполните программу: пошаговом режиме с заходом в процедуру и пронаблюдайте за вызовом функций вычисле- ' -:ия суммы, произведения двух чисел или произведения их суммы и разности. Обратите вни­мание на исполнение оператора Write(Operation(X,Y):5), как в зависимости от фактического значения параметра-функции Operation процедурного типа Func осуществляется вызов раз-~гчных функций Add, Mult или Funny. Попробуйте удалить строку с директивой компиля-т эру об использовании дальнего типа вызова или возьмите в фигурные скобки описание "гоцедурного типа Func и пронаблюдайте за результатом. В случае появления ошибок нажа-~!гм клавиши F1 получите справку о причинах ошибки и рекомендации на коррекцию.




Поделиться с друзьями:


Дата добавления: 2015-05-09; Просмотров: 1599; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.023 сек.