Передача аргументов

Передача аргументов

Один из аспектов нотации требует разъяснений: что происходит со значениями, переданными в качестве аргументов подпрограмме?

Рассмотрим вызов в форме

r (a1, a2, ..., an)

соответствующий программе

r (x1: T1, x2: T2, ..., xn: Tn) is ...

где r может быть как функцией, так и процедурой, и вызов может быть квалифицированным, как в b.r (...). Выражения a1, a2, ..., an называются фактическими аргументами, а xi - формальными. (Помните, что для родовых параметров типа остается термин "параметр".)

Встают важные вопросы: каково соответствие между фактическими и формальными аргументами? Какие операции допустимы над формальными аргументами? Каково их влияние на соответствующие фактические аргументы?

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

x1 := a1; x2 := a2;... xn := an

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

[x]. Присваивание x значения в форме x := ...

[x]. Процедуры создания, где x является целью: create x.make (...)

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

Ответ на третий вопрос - что может программа делать с фактическими аргументами? - вытекает из того, что присоединение используется для задания семантики связывания формальных и фактических аргументов. Присоединение (см. 13.1)

dont_I_look_innocuous (a, b: INTEGER) is -- я выгляжу

-- безвредной, но не стоит мне доверять.

do

a := 0; b := 1

end

Теперь рассмотрим вызов dont_I_look_innocuous (x, x). Каково значение x после возвращения: 0 или 1? Ответ зависит от того, как компилятор реализует изменения формальных - фактических аргументов при выходе программы. Это ставит в тупик не только программистов, использующих язык Fortran.

Разрешение программе изменять аргументы приводит к ограничениям на фактические аргументы. В этом случае он должен быть элементом, способным изменять свое значение, что допустимо для переменных, но не постоянных атрибутов (см. 13.2).

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

26.6. Синтаксический анализ строк аргументов

Из книги автора

26.6. Синтаксический анализ строк аргументов Хотя библиотека popt обычно используется для синтаксического анализа аргументов, уже разделенных на массив вида argv, в некоторых программах необходимо анализировать синтаксис строк, формат которых идентичен командным строкам.


26.7. Обработка дополнительных аргументов

Из книги автора

26.7. Обработка дополнительных аргументов Некоторые приложения реализуют эквивалент псевдонимов параметров, однако для этого им необходима специальная логика. Функция poptStuffArgs() позволяет приложению вставлять новые аргументы в текущую структуру poptContext.#include <popt.h>int


Передача аргументов новым потокам

Из книги автора

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


Использование аргументов

Из книги автора

Использование аргументов Возможно, вы уже заметили, что большинство программ в Linux не интерактивны. Вы должны указать им какие-то параметры, в противном случае вы получите сообщение со списком возможных аргументов. Возьмем, к примеру, команду more. Если вы не укажете имя


Получение списка аргументов

Из книги автора

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


Урок № 67. Передача собственных материалов в переработку на сторону и передача продукции из давальческого сырья

Из книги автора

Урок № 67. Передача собственных материалов в переработку на сторону и передача продукции из давальческого сырья В процессе производственной деятельности предприятия часто приходится осуществлять передачу собственных материалов стороннему переработчику для выпуска


Наличие нескольких аргументов

Из книги автора

Наличие нескольких аргументов      Если для связи с некоторой функцией требуется более одного аргумента, то наряду с именем функции можно задавать список аргументов, разделенных запятыми, как показано ниже. printnum(i,j) int i, j;{ printf(" Новых точек = %d. Всего точек = %d. ", i, j); }     Мы


Структуры в качестве аргументов функции

Из книги автора

Структуры в качестве аргументов функции В не расширенном языке Си можно передавать функции адрес структуры. Например, если montana является структурной переменной структурного типа player, мы можем обратиться к функции следующим образом: stats(&montana);Функция stats( ) будет иметь


2.1.1. Список аргументов

Из книги автора

2.1.1. Список аргументов Для запуска программы достаточно ввести ее имя в командной строке. Дополнительные информационные элементы, передаваемые программе, также задаются в командной строке и отделяются от имени программы и друг от друга пробелами. Такие элементы


Функции работы со списком аргументов

Из книги автора

Функции работы со списком аргументов Функция Краткое описание va_arg выбрать аргумент из списка va_end переустановить указатель va_start установить указатель на начало списка аргументов Эти макроопределения дают возможность получить доступ к аргументам функции, когда


10.4. Явное задание аргументов шаблона A

Из книги автора

10.4. Явное задание аргументов шаблона A В некоторых ситуациях автоматически вывести типы аргументов шаблона невозможно. Как мы видели на примере шаблона функции min5(), если процесс вывода дает два различных типа для одного и того же параметра шаблона, то компилятор