- •114. Синтаксис команд OpenGl
- •119. Состав и назначение интегрированной среды визуальной разработки. Использование визуальных компонентов.
- •120. Списки и их использование в Прологе
- •121. Способы и устройства получения стереоизображений
- •122. Средства распределения данных субд Oracle
- •1. Удаленные dml-операции.
- •2. Синхронные удаленные вызовы процедур (rpc)
- •124. Стек протоколов tcp/ip
- •125. Структура общего решения линейного однородного дифференциального уравнения 2-го порядка
- •126. Css. Подключение таблиц стилей. Способы использования.
- •127. Структурная схема эвм и процессоров Intel
- •128. Структурный анализ потоков данных. Методология dfd.
- •129. Структуры данных, используемые в пролог программе
- •130. Сущность структурного подхода при проектировании больших систем
- •131. Схема распределения данных. Теория сравнений
- •132. Техническое задание на разработку программы (в соответствии с гост 19.201-79)
- •133. Технология Web Broker. Структура серверного Web-приложения
- •134. Технология постановки/проверки электронной цифровой подписи посредством CryptoAip
- •135. Технология шифрования/расшифрования посредством CryptoAip
- •137. Транзакции в многопользовательском режиме работы
- •138. Управление криптографическими ключами посредством CryptoAip
- •139. Управление криптопровайдерами посредством CryptoAip
- •140. Управление открытыми ключами (cертификаты, стандарт х.509, инфраструктуры систем с открытыми ключами)
- •141. Упрощённая модель компилятора. Функции лексического, синтаксического, семантического анализатора, генератора кода. Взаимодействие блоков компилятора. Проходы компилятора
- •142. Формула полной вероятности и формула Байеса
- •145. Функции двух переменных
- •146. Функции переноса, поворота и масштабирования и их параметры в OpenGl
- •Void glMatrixMode (gLenum mode)
- •Void glLoadMatrix[f d] (gLtype *m)
- •Void glPushMatrix (void)
- •Void glPopMatrix (void)
- •Void glMultMatrix[f d] (gLtype *m)
- •147. Функции. Параметры функций. Способы обмена информацией между функциями
- •149. Функциональный стек lamp
- •150. Цветовые схемы rgba и cmyk
- •151. Что такое операционная система (ос). Основные понятия, концепции ос: системные вызовы; Прерывания; Файлы; Процессы, потоки; Оболочка; Адресное пространство
- •152. Язык JavaScript. Назначение. Способ использования
147. Функции. Параметры функций. Способы обмена информацией между функциями
Функция – это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие. Функция может принимать параметры и возвращать значение.
Любая программа на C++ состоит из функций, одна из которых должна иметь имя main (с нее начинается выполнение программы). Функция начинает выполняться в момент вызова. Любая функция должна быть объявлена и определена. Как и для других величин, объявлений может быть несколько, а определение только одно. Объявление функции должно находиться в тексте раньше ее вызова для того, чтобы компилятор мог осуществить проверку правильности вызова.
Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип возвращаемого значения и список передаваемых параметров.
[ класс ] тип имя ([ список_параметров ])[throw ( исключения )];
int sum(int a, int b); // объявление функции
Определение функции содержит, кроме объявления, тело функции, представляющее собой последовательность операторов и описаний в фигурных скобках:
[ класс ] тип имя ([ список_параметров ])[throw ( исключения )] { тело функции }
int sum(int a, int b) { return (a + b);} // определение функции
Список параметров определяет величины, которые требуется передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя (в объявлении имена можно опускать).
Для вызова функции в простейшем случае нужно указать ее имя, за которым в круглых скобках через запятую перечисляются имена передаваемых аргументов. Вызов функции может находиться в любом месте программы, где по синтаксису допустимо выражение того типа, который формирует функция. Если тип возвращаемого функцией значения не void, она может входить в состав выражений или, в частном случае, располагаться в правой части оператора присваивания.
Обмен информацией между функциями
При работе программы функции должны обмениваться информацией. Это можно осуществить с помощью глобальных переменных, через параметры и через возвращаемое функцией значение.
Использование глобальных переменных
Глобальные переменные видны во всех функциях, где не описаны локальные переменные с теми же именами, поэтому использовать их для передачи данных между функциями очень легко. Тем не менее, это не рекомендуется, поскольку затрудняет отладку программы и препятствует помещению функций в библиотеки общего пользования. Нужно стремиться к тому, чтобы функции были максимально независимы, а их интерфейс полностью определялся прототипом функции.
Если в теле функции имя глобальной переменной совпадает с именем локальной переменной, то все операции выполняются с локальной переменной. Локальная переменная в этом случае скрывает глобальную переменную. Для доступа к глобальной переменной необходимо применить операцию разрешения области видимости. Для этого перед переменной ставится префикс ::
Механизм возврата из функции в вызвавшую ее функцию реализуется оператором
return [ выражение ];
Функция может содержать несколько операторов return, это определяется потребностями алгоритма. Однако, после любого из этих операторов прекращается выполнение функции. Если функция описана как void, выражение не указывается и , кроме того, оператор return можно опускать.
Выражение, указанное после return, неявно преобразуется к типу возвращаемого функцией значения и передается в точку вызова функции. Вместо выражения можно записать переменную или константу.
Использование параметров функции
Механизм параметров является основным способом обмена информацией между вызываемой и вызывающей функциями. Параметры, перечисленные в заголовке описания функции, называются формальными, а записанные в операторе вызова функции – фактическими.
При вызове функции в первую очередь вычисляются выражения, стоящие на месте фактических параметров; затем в стеке выделяется память под формальные параметры функции в соответствии с их типом, и каждому из них присваивается значение соответствующего фактического параметра. При этом проверяется соответствие типов и при необходимости выполняются их преобразования. При несоответствии типов выдается диагностическое сообщение.
Существует два способа передачи параметров в функцию: по значению и по адресу.
При передаче по значению на месте формальных параметров записываются имена фактических параметров. При вычислении функции в стек заносятся копии значений фактических параметров, и операторы функции работают с этими копиями. Доступа к исходным значениям фактических параметров у функции нет, а, следовательно, нет и возможности их изменить.
При передаче по адресу в стек заносятся копии адресов параметров через указатель, ссылку или операцию взятия адреса, а функция осуществляет доступ к ячейкам памяти по этим адресам и может изменить исходные значения параметров
Функции с переменным числом параметров
Если список формальных параметров функции заканчивается многоточием, это означает, что при ее вызове на этом месте можно указать еще несколько параметров. Проверка соответствия типов для этих параметров не выполняется, char и short передаются как int, a float – как double. В качестве примера можно привести функцию printf, прототип которой имеет вид:
int printf (const char*, ...):
Это означает, что вызов функции должен содержать по крайней мере один параметр типа char* и может либо содержать, либо не содержать другие параметры.
Для доступа к необязательным параметрам внутри функции используются макросы библиотеки va_start, va_arg и va_end, находящиеся в заголовочном файле <stdarg.h>.
