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

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Последняя версия Следующая версия справа и слева
fullcircle:21:программа_на_си_ч5 [2010/04/02 22:00]
fullcircle:21:программа_на_си_ч5 [2010/04/12 23:13]
Строка 1: Строка 1:
 ======HOW-TO:​ Программа на Си. Часть 5====== ======HOW-TO:​ Программа на Си. Часть 5======
-<style right> 
-//​Автор:​ Эли Дэ Брувэр (Elie De Brauwer)// 
-</​style>​ 
  
   - [[..:​17:​программа_на_си_ч1|Программа на Си. Часть 1]]   - [[..:​17:​программа_на_си_ч1|Программа на Си. Часть 1]]
Строка 9: Строка 6:
   - [[..:​20:​программа_на_си_ч4|Программа на Си. Часть 4]]   - [[..:​20:​программа_на_си_ч4|Программа на Си. Часть 4]]
   - [[..:​21:​программа_на_си_ч5|Программа на Си. Часть 5]]   - [[..:​21:​программа_на_си_ч5|Программа на Си. Часть 5]]
 +  - [[..:​22:​программа_на_си_ч6|Программа на Си. Часть 6]]
 +  - [[..:​23:​программа_на_си_ч7|Программа на Си. Часть 7]]
 +  - [[..:​24:​программа_на_си_ч8|Программа на Си. Часть 8]]
 +
 +----
 +
 +<style right>
 +//​Автор:​ Эли Дэ Брувэр (Elie De Brauwer)//
 +</​style>​
  
 В предыдущих статьях были освещены практически все основы программирования на Си. Надеюсь,​ что после их прочтения вы убедились в том, что Си - не громоздкий и сложный,​ а очень мощный язык программирования,​ позволяющий выполнять множество низкоуровневых задач. Это последняя статья,​ в которой освещаются "​основы"​. В последующих статьях мы сосредоточимся на практическом применении Си: на диагностировании и решении поставленных проблем в программах. В предыдущих статьях были освещены практически все основы программирования на Си. Надеюсь,​ что после их прочтения вы убедились в том, что Си - не громоздкий и сложный,​ а очень мощный язык программирования,​ позволяющий выполнять множество низкоуровневых задач. Это последняя статья,​ в которой освещаются "​основы"​. В последующих статьях мы сосредоточимся на практическом применении Си: на диагностировании и решении поставленных проблем в программах.
Строка 14: Строка 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>
Строка 48: Строка 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>
Строка 102: Строка 110:
 ---- ----
 <style center> <style center>
-  - [[..:​17:​программа_на_си_ч1|Программа на Си. Часть 1]] +  - [[..:​17:​программа_на_си_ч1|Программа на Си. Часть 1]]
   - [[..:​18:​программа_на_си_ч2|Программа на Си. Часть 2]]   - [[..:​18:​программа_на_си_ч2|Программа на Си. Часть 2]]
   - [[..:​19:​программа_на_си_ч3|Программа на Си. Часть 3]]   - [[..:​19:​программа_на_си_ч3|Программа на Си. Часть 3]]
   - [[..:​20:​программа_на_си_ч4|Программа на Си. Часть 4]]   - [[..:​20:​программа_на_си_ч4|Программа на Си. Часть 4]]
   - [[..:​21:​программа_на_си_ч5|Программа на Си. Часть 5]]   - [[..:​21:​программа_на_си_ч5|Программа на Си. Часть 5]]
 +  - [[..:​22:​программа_на_си_ч6|Программа на Си. Часть 6]]
 +  - [[..:​23:​программа_на_си_ч7|Программа на Си. Часть 7]]
 +  - [[..:​24:​программа_на_си_ч8|Программа на Си. Часть 8]]
 +
 +----
  
 //​[[..:​21|К содержанию номера]]//​ //​[[..:​21|К содержанию номера]]//​
Строка 113: Строка 126:
 </​style>​ </​style>​
  
-{{tag>​Си Програмирование Full_Circle}}+{{tag>howto Си Програмирование Full_Circle}}