Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Последняя версия Следующая версия справа и слева | ||
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}} |