Различия
Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
fullcircle:21:программа_на_си_ч5 [2010/04/02 22:03] |
fullcircle:21:программа_на_си_ч5 [2010/04/14 00:30] (текущий) |
||
|---|---|---|---|
| Строка 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:программа_на_си_ч5|Программа на Си. Часть 6]] | + | - [[..:22:программа_на_си_ч6|Программа на Си. Часть 6]] |
| - | - [[..:23:программа_на_си_ч5|Программа на Си. Часть 7]] | + | - [[..:23:программа_на_си_ч7|Программа на Си. Часть 7]] |
| - | - [[..:24:программа_на_си_ч5|Программа на Си. Часть 8]] | + | - [[..:24:программа_на_си_ч8|Программа на Си. Часть 8]] |
| + | |||
| + | ---- | ||
| + | |||
| + | <style right> | ||
| + | //Автор: Эли Дэ Брувэр (Elie De Brauwer)// | ||
| + | </style> | ||
| В предыдущих статьях были освещены практически все основы программирования на Си. Надеюсь, что после их прочтения вы убедились в том, что Си - не громоздкий и сложный, а очень мощный язык программирования, позволяющий выполнять множество низкоуровневых задач. Это последняя статья, в которой освещаются "основы". В последующих статьях мы сосредоточимся на практическом применении Си: на диагностировании и решении поставленных проблем в программах. | В предыдущих статьях были освещены практически все основы программирования на Си. Надеюсь, что после их прочтения вы убедились в том, что Си - не громоздкий и сложный, а очень мощный язык программирования, позволяющий выполнять множество низкоуровневых задач. Это последняя статья, в которой освещаются "основы". В последующих статьях мы сосредоточимся на практическом применении Си: на диагностировании и решении поставленных проблем в программах. | ||
| Строка 17: | Строка 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> | ||
| Строка 51: | Строка 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> | ||
| Строка 110: | Строка 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]] |
| + | |||
| + | ---- | ||
| //[[..:21|К содержанию номера]]// | //[[..:21|К содержанию номера]]// | ||
| Строка 119: | Строка 126: | ||
| </style> | </style> | ||
| - | {{tag>Си Програмирование Full_Circle}} | + | {{tag>howto Си Программирование Full_Circle}} |