Что такое функция? – язык программирования Си

April 11, 2014 by admin Комментировать »

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

Положительные моменты:

•                 функцию в любой момент времени и в любом месте программы можно вызвать на выполнение, причём неоднократно;

•                 функции избавляют программиста от рутинного клонирования массы повторяющихся операторов;

•                 одну и ту же функцию можно вставить в совершенно разные программы, сокращая тем самым время на разработку и отладку;

•                 применение функций повышает модульность программы, её структурированность, что облегчает чтение листинга, ускоряет внесение изменений.

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

Функции в языке Си можно условно разделить на три вида: системные, внутренние и внешние.

Системные функции прилагаются к любому компилятору. В WinAVR их можно найти в библиотечном справочнике, находящемся по адресу C:\WinAVR-2010010\ doc\avr-libc\avr-libc-user-manual.pdf (далее — «Библиотечное руководство»).

Каждая системная функция входит строго в свою библиотеку. Названия библиотек и функций в разных компиляторах отличаются. Объявление используемых библиотек производится в «шапке» программы директивой препроцессора «#inC1ude <имя заголовочного файла-хеддера>».

Символ «#» пишется слитно со словом «inC1ude» и обязательно начинается в первом столбце листинга. «Хеддер» — это файл с расширением «.h», в котором описываются параметры функций. К системным также относится головная функция «main», без которой не обходится ни одна программа в языке Си.

Строго говоря, использование системных функций затрудняет переносимость программ с одной платформы MK надругую. В разных компиляторах исповедуют разную философию программирования. Например, одни разработчики стараются включать в состав компилятора только международно стандартизованные библиотеки и функции, другие — наоборот, создают множество своих узкоспециализированных функций, которые очень удобные для программистов, но абсолютно далёкие от стандартов.

Компилятор AVR-GCC, используемый в пакете WinAVR, занимает по сравнению с другими компиляторами золотую середину. В его составе имеются примерно в равной части функции общепринятых стандартов ANSI, C99, а также собственные микроконтроллерные библиотеки.

Досконально изучив системные функции одного компилятора, программист в какой-то мере «привязывается» к ним и не хочет переучиваться на новые. Вот где требуется поистине шахматный расчёт, чтобы с первого раза выбратьдля изучения солидный, мощный и постоянно обновляемый (а значит, «живой»!) компилятор. К слову сказать, AVR-GCC пока оправдывает все ожидания пользователей.

В стандартные библиотеки компиляторов, наряду с функциями, входят также системные макроопределения, например, специфические для пакета WinAVR «_BV», «bit_is_set», «bit_is_C1ear». Подробности их применения освещаются в «Библиотечном руководстве».

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

Сколько раз должна вызываться внутренняя функция? Желательно два и более раза, иначе теряются преимущества от её применения. Использование внутренних функций эффективно там, где требуется много раз выполнять одни и те же повторяющиеся действия. Чем чаще вызываются функции, тем выше получается степень сжатия программного кода.

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

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

2.               Программы с большим числом строк труднее поддаются анализу, коррекции, отладке. Чтобы соблюсти принцип модульности, желательно разбивать программу на логически обособленные мелкие части, которые легко редактируются, переставляются, заменяются.

3.               Если сделать внешние функции максимально автономными в работе, то их в будущем можно использовать совместно с другими программами. Дальновидные программисты стараются создавать свои «родные» библиотеки, состоящие из специализированных функций. К примеру, хороший набор готовых внешних функций для AVR-контроллеров содержится в бесплатной библиотеке Паскаля Стэнга [6-20].

По устоявшейся традиции, все имена функций, как и имена переменных, записывают малыми латинскими буквами. Цифры допускаются во всех позициях имени, кроме первой слева. Названия системных функций изменять нельзя, они определяются стандартами, в отличие от внутренних и внешних функций, имена которым придумывают, кто как хочет. Единственное ограничение, чтобы новые названия отличались от названий системных функций, иначе компилятор выдаёт сообщение об ошибке: «Error previous definition».

За именем функции обязательно следуют круглые скобки, в которых при необходимости указывают передаваемые/принимаемые параметры. В Табл. 6.9 перечислены все допустимые форматы объявления и вызова функций в AVR-GCC.

Таблица 6.9. Форматы объявления и вызова функций в AVR-GCC

Формат объявления функции __ «example()»

Комментарии, пояснения

Пример вызова функции «example()»

void example (void)

Функция не имеет ни входных, ни выходных параметров

example ();

void example (unsigned char d)

Функция принимает число из переменной «х» и транслирует его в переменную «d»

example (x);

unsigned char example (void)

Функция передаёт в основную программу число «х» с размерностью «unsigned char»

x = example ();

unsigned char example (unsigned chard)

Функция имеет входной (переменная «у») и выходной («unsigned char» x) параметры

x = example (y);

Примечание. Вместо «unsigned char» можетбытьлюбой другой тип, например, «unsigned int».

Источник: Рюмик, С. М., 1000 и одна микроконтроллерная схема. Вып. 2 / С. М. Рюмик. — М.:ЛР Додэка-ХХ1, 2011. — 400 с.: ил. + CD. — (Серия «Программируемые системы»).

Оставить комментарий

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