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

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
fullcircle:21:программа_на_си_ч5 [2010/04/02 21:39]
H3C
fullcircle:21:программа_на_си_ч5 [2010/04/14 00:30] (текущий)
AgafonovAgafonovAgafonovНам помехи не страшны!
Строка 1: Строка 1:
 ======HOW-TO:​ Программа на Си. Часть 5====== ======HOW-TO:​ Программа на Си. Часть 5======
 +
 +  - [[..:​17:​программа_на_си_ч1|Программа на Си. Часть 1]]
 +  - [[..:​18:​программа_на_си_ч2|Программа на Си. Часть 2]]
 +  - [[..:​19:​программа_на_си_ч3|Программа на Си. Часть 3]]
 +  - [[..:​20:​программа_на_си_ч4|Программа на Си. Часть 4]]
 +  - [[..:​21:​программа_на_си_ч5|Программа на Си. Часть 5]]
 +  - [[..:​22:​программа_на_си_ч6|Программа на Си. Часть 6]]
 +  - [[..:​23:​программа_на_си_ч7|Программа на Си. Часть 7]]
 +  - [[..:​24:​программа_на_си_ч8|Программа на Си. Часть 8]]
 +
 +----
 +
 <style right> <style right>
 //​Автор:​ Эли Дэ Брувэр (Elie De Brauwer)// //​Автор:​ Эли Дэ Брувэр (Elie De Brauwer)//
Строка 8: Строка 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>
Строка 42: Строка 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>
Строка 93: Строка 107:
 <note tip>Elie De Brauwer - фанатик Linux из Бельгии. Когда он не со своей семьёй,​ он любит играть с технологиями и проводит дни, ожидая,​ когда Blizzard наконец выпустит Diablo III. </​note>​ <note tip>Elie De Brauwer - фанатик Linux из Бельгии. Когда он не со своей семьёй,​ он любит играть с технологиями и проводит дни, ожидая,​ когда Blizzard наконец выпустит Diablo III. </​note>​
  
 +
 +----
 +<style center>
 +  - [[..:​17:​программа_на_си_ч1|Программа на Си. Часть 1]]
 +  - [[..:​18:​программа_на_си_ч2|Программа на Си. Часть 2]]
 +  - [[..:​19:​программа_на_си_ч3|Программа на Си. Часть 3]]
 +  - [[..:​20:​программа_на_си_ч4|Программа на Си. Часть 4]]
 +  - [[..:​21:​программа_на_си_ч5|Программа на Си. Часть 5]]
 +  - [[..:​22:​программа_на_си_ч6|Программа на Си. Часть 6]]
 +  - [[..:​23:​программа_на_си_ч7|Программа на Си. Часть 7]]
 +  - [[..:​24:​программа_на_си_ч8|Программа на Си. Часть 8]]
 +
 +----
 +
 +//​[[..:​21|К содержанию номера]]//​
 +
 +//​[[:​fullcircle|К архиву журналов]]//​
 +</​style>​
 +
 +{{tag>​howto Си Программирование Full_Circle}}