Функция – это программный модуль, блок, единица из которых строится вся программа языка С. Функция выполняет какую-либо конкретную задачу.
Функция начинается с ключевого слова, определяющее, тип данных, имеет имя, определяющее осмысленную функциональность( по этому имени будет осуществляться вызов из другой функции ), в скобках описывается перечень аргументов с определенным типом данных, разделенных запятыми и фигурные скобки, являющиеся телом функции:
тип данных имя( аргумент имя_1, аргуметн имя_2, . . . , аргумент имя_n ) { /* тело функции */ }
например:
void outStrDisplay( int adressStr, char *dataStr ); { /* список операторов и вызовов функций */ }
В конце функции точка с запятой не ставится, за исключением объявления прототипа функции:
тип данных имя( аргумент имя_1, аргуметн имя_2, . . . , аргумент имя_n );
например:
unsigned char stateModule( unsigned char mode, unsigned char value, . . . );
функция определяется в четырех состояниях:
1. функция не принимает данные и не возвращает результат
void func( void ) { PORTD.1=1; PORTC=0x3d;
}
2. функция принимает данные( имеет список аргументов ) и не возвращает результат
void func( unsigned char data1, unsigned char data2, . . . ) { if( data1!=0 ){ }else{ } if( data2==0x001f ){ } . . . }
3. функция принимает данные и возвращает результат
unsigned char func( unsigned char mode ) { unsigned char temp; switch( mode ) { case 0: temp=PINC; break; case 1: temp=PIND; break; } return temp; }
4. функция не принимает данные и возвращает результат
unsigned char func( void ) { unsigned char temp; temp = PINC;
return temp; /* байт состояния порта */ }
В таблице представлены типы данных, названия, размер:
Структура программы языка программирования С ( среда CodeVisionAVR )
/* перечень подключеных, заголовочных файлов */ #include <name.h> #include <function.h> /* библиотека разработчика */ . . .
/* перечень директив препроцессора */ /* компилятор замен label_name на label_function */ #define label_name label_function . . .
/* перечень объявленых переменных и массивов */ /* состояние: глобальные */ unsigned char temp1; int temp2; char scrBuf[16]; . . .
/* вторичные функции */ void func_1( void ) { unsigned char tmp; /* локальная переменная */ }
void func_2( void ) { func_1( ); }
/* главная функция. Точка входа в программу, содержащая множество других вызовов функций и операторов*/ void main( void ) { func_2( ); }
На следующем рисунке показаны взаимодействие файлов библиотеки с файлами проекта: Желательно и даже необходимо указывать прототипы функций( соответственно выше функции main по структуре программы ) до их полной реализации( определения ). Тогда последние можно распологать в любом месте основной программы, не опасаясь что компилятор выдаст ошибку:
#include < >
/* прототипы функций */ void func2( void ); void func( void );
/* main - точка входа в программу */ void main( void ) { func( );
while( 1 ); }
/* определение функций ( реализация ) */ void func( void ) { func2( ); }
void func2( void ) {
} или в таком виде: #include < >
/* прототипы функций */ void func2( void ); void func( void );
void func2( void ) {
} /* main - точка входа в программу */ void main( void ) { func( );
while( 1 ); }
/* определение функций ( реализация ) */ void func( void ) { func2( ); }
Если прототипы функций не указывать, то функции( реализация ) необходимо распологать таким образом, чтобы вызывающая функция находилась ниже вызываемой:
/* функция func( вызывающая ) находится ниже функции func2( вызываемая ) */ void func2( void ) {
}
void func( void ) { func2( ); }
В противном случае компилятор выдаст ошибку:
Вопросы задаем на форуме |