Процедуры и функции. Заголовок и тело процедур и функции, классификация параметров. Вызов процедур и функций, особенности их использования — КиберПедия 

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Процедуры и функции. Заголовок и тело процедур и функции, классификация параметров. Вызов процедур и функций, особенности их использования

2021-02-05 159
Процедуры и функции. Заголовок и тело процедур и функции, классификация параметров. Вызов процедур и функций, особенности их использования 0.00 из 5.00 0 оценок
Заказать работу

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

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

 

Функция состоит из заголовка (1) и тела (2). Заголовок функции – это ее интерфейсная (описательная) часть, которая не дает программного кода, а содержит описание входных и выходных параметров, необходимых при ее выполнении (вызове). Тело функции – это программный код (блок), ограниченный фигурными скобками. Тело функции при трансляции преобразуется во внутреннее (двоичное) представление и размещается в сегменте команд программы (см. 1.2). Существует также синтаксис, в котором присутствует только заголовок, ограниченный символом «;». В этом случае речь идет об объявлении функции – информировании транслятора о ее наличии и интерфейсе.

 

В заголовке находится имя функции (3), после которого в скобках – список формальных параметров, разделенных запятыми (4). Список может быть и пустым. Синтаксис формального параметра (5) – это синтаксис определения переменной (см. 1.3), что наводит на мысль, что формальные параметры – это особого рода переменные, которые используются для передачи параметров (значений) при вызове (выполнении) функции.

Внутри тела функции могут находиться определения обычных переменных (7), которые называются локальными (в терминологии Си - автоматическими). Тело каждой функции представляет собой отдельное изолированное пространство, в котором допустимо использование собственных переменных (9), составляющих неявное окружение – контекст функции. В него входят вышеуказанные формальные параметры и локальные переменные. Кроме того, контекст функции является короткоживущим: он создается при входе в функцию и разрушается при завершении ее выполнения.

Формальные параметры используются для передачи входных и выходных данных в функцию. Кроме них функция имеет еще одну неявную выходную переменную – результат функции. Результат функции - это временная переменная, которая возвращается функцией и может быть использована как операнд в той части выражения (13), где был произведен ее вызов (10).

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

 

int sum(... // Результат - целая переменная

char *FF(... // Результат - указатель на символ

 

Значение переменной - результатa устанавливается в операторе return (8), который производит это действие наряду с завершением выполнения функции и выходом из нее. Между ключевым словом return и ограничивающим символом ";" может стоять любое выражение, значение которого и становится результатом функции. Если вспомнить еще и о преобразованиях типов, то при таком «присваивании» результата таковое должно производиться от типа, соответствующего выражению к типу результата функции:

double FF()

{ int nn; // Эквивалент

return (nn+1); // FF = (double)(nn + 1)

 

Имеется специальный пустой тип результата - void, который обозначает, что функция не возвращает никакого результата и, соответственно, не может быть вызвана внутри выражения. Оператор return в такой функции также не содержит никакого выражения. При вызове этой функции ее результат не может быть использован.

void Nothing() { return; }

void main(){

Nothing(); // Просто вызов без использования результата

}

 

Определение функции представляет собой всего лишь статическую «заготовку» программы. Выполнение ее происходит тогда, когда в процессе вычисления выражения встречается вызов функции. Синтаксически вызовом функции называется упоминание имени этой функции в выражений (10), причем после имени функции в скобках следует список фактических параметров (12).

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

· между формальными и фактическими параметрами устанавливается «один-один» соответствие, которое действует только в течение текущего вызова функции (динамически);

· существуют различные способы установления соответствия, на настоящий момент реально распространенными в языках программирования являются способы передачи параметров по ссылке и по значению;

· фактические параметры имеются синтаксис выражения (см 1.4). Это значит, что в них не определяются, а используются переменные и их сочетания, определенные в текущем контексте (11). Например, если определение массива имеет вид int A [], и в таком виде оно будет присутствовать в списке формальных параметров, то при вызове функции фактическим параметром может быть имя массива C определенного аналогичным образом (т.е. переменная C, являющаяся массивом).

 

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

 

void main() {...}

void main(void) {...}

void main(int narg, char *argv[]) {...} // с интерфейсом командной строки

 

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

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

· формальные параметры являются собственными переменными функции, аналогом локальных переменных;

· при вызове функции происходит присваивание формальным параметрам значений фактических (копирование вторых в первые);

· при изменении формальных параметров значения соответствующих им фактических параметров не меняются;

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

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

· формальные параметры существуют как синонимы фактических, в этом смысле они не являются «настоящими» переменными, под которые отводится память, а реализуется как элемент отображения;

· при изменении значений формальных параметров эти изменения проецируются на соответствующие им фактические;

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

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

 

 

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

· по умолчанию (т.е. при отсутствии явных символов обозначения) все параметры, кроме массивов, передаются по значению, т.е. копируются;

· массивы передаются исключительно по ссылке, т.е. отображаются;

· для явного указания способа передачи параметра по ссылке служит символ «&», который записывается перед именем формального параметра.

Механизм вызова функции

Механизм вызова функции является динамическим, т.е. действия, связанные с его реализацией, осуществляются при выполнении программы. Именно поэтому текст программы и его «развертка» во времени представляют для функции «две большие разницы». Это касается двух вещей:

· последовательность выполняемых действий (поток управления) при вызовах функций:

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

Именно поэтому мы и рассмотрим процесс вызова вышеприведенной функции в «исторической перспективе»:

1. результатом трансляции функции является программный код, размещенный в сегменте команд;

2. в вызывающей функции (main) определяются переменные, используемые в качестве фактических параметров вызова функции (массив B);

3. выполняется программный код вызывающей функции, пока в ней не встретится выражение, содержащий вызов функции;

4. в соответствии со списком фактических параметров устанавливается соответствие между элементами контекста вызывающей функции и формальными параметрами;

Рис. Механизм вызова функции

5. формальный параметр – массив A передается по ссылке - отображается на фактический параметр, аналогичный массив B, определенный в контексте вызывающей функции;

6. формальный параметр n – размерность массива A передается по значению, т.е. копируется, в качестве копируемого значения выступает константа;

7. сохраняется точка возврата в вызывающую функцию, после чего происходит переход к началу блока программного кода функции sum;

8. выполняется программный код функции sum;

9. в контексте вызываемой функции используются локальные переменные и формальные параметры, в соответствии со способами передачи параметров массив A отображается на исходный массив B в контексте main;

10. оператор return возвращает значение локальной переменной s в качестве переменной – результата в выражение, где находится вызов;

11. одновременно return производит переход в вызывающую функцию main в точку возврата;

12. продолжается выполнение программного кода вызывающей функции.

 

 

Области действия функций. Определения и объявления

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

· имя функции;

· тип результата;

· список формальных параметров (переменные и типы).

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

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

 

int B[10];

int sum(int s[],int n); // Объявление функции,

// определенной далее по тексту

extern int printf(char *,...); // Объявление библиотечной функции

// с переменным числом параметров

extern int other(void); // Объявление функции без

// параметров из другого

void main() // файла программы

{ sum(B,10); other(); } // Вызовы объявленных функций

 

int sum(int s[], int n) {...} // Определение ранее объявленной функции

 

 

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

· объявление заканчивается символом ";";

· если функция находится вне текущего файла, то объявление предваряется служебным словом extern;

· имена переменных в списке формальных параметров объявления могут отсутствовать;

· если функция не имеет формальных параметров, то в объявлении присутствует формальный параметр типа void.

Имея предварительно определенную функцию или ее объявление, транслятор в состоянии проверить соответствие формальных и фактических параметров как по их количеству, так и по типам. При этом транслятор может выполнить неявные преобразования типов фактических параметров к типам формальных, если это потребуется:

 

extern double sin(double);

int x; double y;

y = sin(x); //------Неявное преобразование (double)x


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

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.052 с.