HOW-TO: Программа на Си. Часть 5 Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
fullcircle:21:программа_на_си_ч5 [2010/04/04 18:50]
fullcircle:21:программа_на_си_ч5 [2010/04/14 00:30]
Строка 6: Строка 6:
   - [[..:​20:​программа_на_си_ч4|Программа на Си. Часть 4]]   - [[..:​20:​программа_на_си_ч4|Программа на Си. Часть 4]]
   - [[..:​21:​программа_на_си_ч5|Программа на Си. Часть 5]]   - [[..:​21:​программа_на_си_ч5|Программа на Си. Часть 5]]
-  - [[..:​22:​программа_на_си_ч5|Программа на Си. Часть 6]] +  - [[..:​22:​программа_на_си_ч6|Программа на Си. Часть 6]] 
-  - [[..:​23:​программа_на_си_ч5|Программа на Си. Часть 7]] +  - [[..:​23:​программа_на_си_ч7|Программа на Си. Часть 7]] 
-  - [[..:​24:​программа_на_си_ч5|Программа на Си. Часть 8]]+  - [[..:​24:​программа_на_си_ч8|Программа на Си. Часть 8]]
  
 ---- ----
Строка 20: Строка 20:
 =====Указатели на функции===== =====Указатели на функции=====
 Как уже говорилось,​ если int a является целой переменной,​ то int * b=&a создаёт и инициализирует указатель b на a. Посмотрите на Листинг 1. В нём есть функция divide (строки 1-4), а на строке 6 - команда typedef, определяющая новый тип данных "​mathFun"​. Это указатель на функцию,​ которая возвращает целое число и принимает два целых в качестве аргументов. В строках с 8 по 12 определяется структура,​ которая объединяет символ с функцией. Этот приём называется "​обратный вызов"​ (callback) или обработчик (handler), и его используют очень часто. Этот приём может быть использован,​ чтобы симулировать объектно-ориентированное программирование в Си. Нужно определить структуру с некоторыми данными и указателями на функции,​ и в результате получится практически класс. Но наиболее часто он используется в GUI-программировании для регистрации функции,​ которая вызывается,​ когда пользователь совершает какое-либо действие. Если у вас установлен пакет manpages-dev,​ то набрав "man qsort" вы увидите определение функции,​ которая реализует алгоритм (см. Листинг 2). Как видите,​ эта функция способна сортировать данные и указатель на неё должен быть передан функции,​ которая может выполнять сравнения,​ что полезно при сортировке массива значений независимо от их характера. Как уже говорилось,​ если int a является целой переменной,​ то int * b=&a создаёт и инициализирует указатель b на a. Посмотрите на Листинг 1. В нём есть функция divide (строки 1-4), а на строке 6 - команда typedef, определяющая новый тип данных "​mathFun"​. Это указатель на функцию,​ которая возвращает целое число и принимает два целых в качестве аргументов. В строках с 8 по 12 определяется структура,​ которая объединяет символ с функцией. Этот приём называется "​обратный вызов"​ (callback) или обработчик (handler), и его используют очень часто. Этот приём может быть использован,​ чтобы симулировать объектно-ориентированное программирование в Си. Нужно определить структуру с некоторыми данными и указателями на функции,​ и в результате получится практически класс. Но наиболее часто он используется в GUI-программировании для регистрации функции,​ которая вызывается,​ когда пользователь совершает какое-либо действие. Если у вас установлен пакет manpages-dev,​ то набрав "man qsort" вы увидите определение функции,​ которая реализует алгоритм (см. Листинг 2). Как видите,​ эта функция способна сортировать данные и указатель на неё должен быть передан функции,​ которая может выполнять сравнения,​ что полезно при сортировке массива значений независимо от их характера.
 +
 **Листинг 1:** **Листинг 1:**
 <code c> <code c>
Строка 54: Строка 55:
  
 В Листинге 3 приведена простая реализация этой программы. В строке 3 происходит выделение хранилища для четырёх структур,​ которые заполняются оператором и указателями на функции в строках 4 по 7. Далее на строках 12-18 обрабатывается ввод пользователя. Когда пользователь что-то ввёл, в строках 20-32 производится поиск в массиве команд значения,​ соответствующего знаку операции. Если значение найдено,​ происходит обратный вызов с прочитанными данными,​ и выводится результат. И больше ничего делать не нужно. В Листинге 3 приведена простая реализация этой программы. В строке 3 происходит выделение хранилища для четырёх структур,​ которые заполняются оператором и указателями на функции в строках 4 по 7. Далее на строках 12-18 обрабатывается ввод пользователя. Когда пользователь что-то ввёл, в строках 20-32 производится поиск в массиве команд значения,​ соответствующего знаку операции. Если значение найдено,​ происходит обратный вызов с прочитанными данными,​ и выводится результат. И больше ничего делать не нужно.
 +
 **Листинг 3: основной цикл ​ calc.c** **Листинг 3: основной цикл ​ calc.c**
 <code c> <code c>
Строка 113: Строка 115:
   - [[..:​20:​программа_на_си_ч4|Программа на Си. Часть 4]]   - [[..:​20:​программа_на_си_ч4|Программа на Си. Часть 4]]
   - [[..:​21:​программа_на_си_ч5|Программа на Си. Часть 5]]   - [[..:​21:​программа_на_си_ч5|Программа на Си. Часть 5]]
-  - [[..:​22:​программа_на_си_ч5|Программа на Си. Часть 6]] +  - [[..:​22:​программа_на_си_ч6|Программа на Си. Часть 6]] 
-  - [[..:​23:​программа_на_си_ч5|Программа на Си. Часть 7]] +  - [[..:​23:​программа_на_си_ч7|Программа на Си. Часть 7]] 
-  - [[..:​24:​программа_на_си_ч5|Программа на Си. Часть 8]]+  - [[..:​24:​программа_на_си_ч8|Программа на Си. Часть 8]]
  
 ---- ----
Строка 124: Строка 126:
 </​style>​ </​style>​
  
-{{tag>​Си Програмирование Full_Circle}}+{{tag>howto Си Программирование Full_Circle}}