11.2. Способы передачи параметров
Взаимодействие программной единицы (программы или подпрограммы) с некоторой подпрограммой происходит в результате обращения к (вызова) последней. Прежде чем рассмотреть способы обмена информации между ними, введем следующее обозначение. Ту подпрограмму, к которой происходит обращение, будем называть вызываемой подпрограммой, а ту программную единицу, которая вызывает подпрограмму, в данном разделе будем называть вызыващей программой (хотя вызывающей может быть как программа, так и подпрограмма). Это будет сделано только для более компактного изложения материала.
Существуют два варианта обмена информацией между вызывающей программой и вызываемой подпрограмой:
с помощью механизма формальныых - фактических параметров;
с использованием глобальных переменных .
Вначале коснемся способа передачи, основанного на использвании глобальных переменных. Напомним, что глобальные переменные – это переменные, описанные в вызыващей и доступные в вызываемой подпрограмме, и поэтому в передаче данных нет никакой необходимости: изменения их значений в процессе работы подпрограммы, после ее завершения могут без всяких дополнительных действий быть использованы и в вызывающей подпрограмме.
Несмотря на очевидную простоту данного способа взаимодействия, он имеет и недостатки. В первую очередь это относится к тому, что в процессе работы подпрограммы кроме переменных, в которых должны быть возвращены результаты работы вызываемой подпрограммы, могут быть изменены также значения тех переменных вызывающей программы, которые не должны были изменяться. Это приведет к тому, что гарантировать правильную работу вызывающей программы только на основе анализа ее алгоритма, станет невозможно. Могут возникнуть проблемы также и при разработке подпрограммы, поскольку обеспечить правильность ее работы в процессе разработки также будет непросто, а иногда и невозможно, в связи с тем, что обеспечить гарантированно известные значения глобальных для нее переменных в подпрограмме к моменту начала ее работ после вызова, нельзя.
Следствием сказанного становится невозможность применения в чистом виде технологии нисходящего проектирования, а это усложненяет процедурыу и увеличенивает время разработки программы.
Теперь рассмотрим способ, основанный на передаче параметров.
При активизации подпрограммы ей можно передать параметры. Параметры, указываемые в заголовке подпрограммы при ее описании, называются формальными. Посредством этих параметров вызыващая програма передает входные данные в вызываемую подпрограмму, а при завершении работы последней получает результаты ее работы.
Параметры, которые содержат исходные данные для работы подпрограммы, называются входными. Их значение обязательно должно быть определено к моменту вызова подпрограммы. Параметры, в которых подпрограмма формирует результаты работы, возвращаемые в вызывающую программу, называются выходными. Значения выходных параметров могут быть не определены (не инициализированы) при вызове подпрограммы, но обязательно получат значения в процессе ее выполнения.
Некоторые параметры могут быть одновременно входными и выходными, т.е. вызывающая программа должна инициализировать их до или в момент вызова подпрограммы, а после завершения работы последней получит в них новые значения (результаты). Такие параметры оформляются также как и выходные, но при разработке подпрограммы учитывается, что их значения в момент вызова инициализированы.
Формальные параметры обемпечивают возможность задать формальные функциональные связи между входными и выходными параметрами.
Параметры, указываемые при вызове подпрограммы, называются фактическими. Они определяются при вызове подпрограммы и в них используются данные, внешние по отношению к вызываемой подпрограмме. В момент вызова формальные параметры заменяются фактическими.
При передаче параметров необходимо обеспечить выполнение следующих требований:
число формальных и фактических парамеров должно совпадать;
порядок перечисления формальных и фактических параметров должны совпадать;
каждый фактический параметр должен соответствовать по типу своему формальному параметру.
Сфера действия имен параметров такая же, как и локальных данных.
По способу передачи параметры различаются:
По взаимодействию вызывающей и вызываемой подпрограммы:
только входной параметр;
только выходной параметр;
как входной, так и выходной параметр (входной-выходной).
По механизму передачи:
передача по значению;
передача по наименованию (по ссылке)
Суть передачи по значению заключается в следующем: в момент вызова значение фактического параметра, присваивается переменной, являющейся формальным параметром, а при возврате из подпрограммы, значения формального параметра, наоборот, присваиватся соответствующему фактическому параметру.
При передаче по наименованию присваивания значений не происходит, а вместо этого, адрес в памяти формального параметра замещается адресом фактического параметра (ссылкой на фактический параметр).
В Турбо Паскале реализованы следующие способы передачи:
если входной параметр скалярный – он может передаваться как по значению, так и по ссылке;
если входной параметр не скалярный (например, массив) – он может передаваться только по ссылке;
выходной или входной-выходной параметры могут передаваться только по ссылке.
При описании параметра в заголовке подпрограммы необходимо придерживаться следующих правил:
е
<идентификатор> : <тип>
сли параметр передается по значению, его описание в заголовке имеет вид
е
var <идентификатор> : <тип>
сли параметр передается по ссылке, его описание в заголовке имеет вид
Требования к способу представления фактического параметра:
если параметр подпрограммы входной и передается по значению, фактическим параметром может быть любое выражение (константа или переменная – это частный случай выражения), имеющее тип, совместимый по присваиванию с типом формального параметра;
если параметр подпрограммы передается по ссылке, фактическим параметром может быть только идентификатор переменной, совместимый по присваиванию с типом формального параметра.
