Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Текст лекций.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
1.59 Mб
Скачать

11.2. Способы передачи параметров

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

Существуют два варианта обмена информацией между вызывающей программой и вызываемой подпрограммой:

  1. с помощью механизма формальных - фактических параметров;

  2. с использованием глобальных переменных .

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

Несмотря на очевидную простоту данного способа взаимодействия, он имеет и недостатки. В первую очередь это относится к тому, что в процессе работы подпрограммы кроме переменных, в которых должны быть возвращены результаты работы вызываемой подпрограммы, могут быть изменены также значения тех переменных вызывающей программы, которые не должны были изменяться. Это приведет к тому, что гарантировать правильную работу вызывающей программы только на основе анализа ее алгоритма, станет невозможно. Могут возникнуть проблемы также и при разработке подпрограммы, поскольку обеспечить правильность ее работы в процессе разработки также будет непросто, а иногда и невозможно, в связи с тем, что нельзя обеспечить гарантированно известные значения глобальных для нее переменных в подпрограмме к моменту начала ее работы после вызова.

Следствием сказанного становится невозможность применения в чистом виде технологии нисходящего проектирования, а это усложняет процедуру и увеличивает время разработки программы.

Теперь рассмотрим способ, основанный на передаче параметров.

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

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

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

Формальные параметры обеспечивают возможность задать формальные функциональные связи между входными и выходными параметрами.

Параметры, указываемые при вызове подпрограммы, называются фактическими. Они определяются при вызове подпрограммы и в них используются данные, внешние по отношению к вызываемой подпрограмме. В момент вызова формальные параметры заменяются фактическими.

При передаче параметров необходимо обеспечить выполнение следующих требований:

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

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

  • каждый фактический параметр должен соответствовать по типу своему формальному параметру.

Сфера действия имен параметров такая же, как и локальных данных.

По способу передачи параметры различаются:

  1. По взаимодействию вызывающей и вызываемой подпрограммы:

  • только входной параметр;

  • только выходной параметр;

  • как входной, так и выходной параметр (входной-выходной).

  1. По механизму передачи:

  • передача по значению;

  • передача по наименованию (по ссылке)

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

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

В Турбо Паскале реализованы следующие способы передачи:

  • если входной параметр скалярный – он может передаваться как по значению, так и по ссылке;

  • если входной параметр не скалярный (например, массив) – он может передаваться только по ссылке;

  • выходной или входной-выходной параметры могут передаваться только по ссылке.

При описании параметра в заголовке подпрограммы необходимо придерживаться следующих правил:

  • если параметр передается по значению, его описание в заголовке имеет вид

Frame176

  • если параметр передается по ссылке, его описание в заголовке имеет вид

Frame177

Требования к способу представления фактического параметра:

  • если параметр подпрограммы входной и передается по значению, фактическим параметром может быть любое выражение (константа или переменная – это частный случай выражения), имеющее тип, совместимый по присваиванию с типом формального параметра;

  • если параметр подпрограммы передается по ссылке, фактическим параметром может быть только идентификатор переменной, совместимый по присваиванию с типом формального параметра.