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

article26.jpg

Функция – это программный модуль, блок, единица из которых строится вся программа языка С. Функция выполняет какую-либо конкретную задачу.

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

 тип данных имя( аргумент имя_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( );
 }


В противном случае компилятор выдаст ошибку:


(источник)

Похожие статьи:

Микроконтроллерные системыФункция sprintf стандартной библиотеки stdio.h