Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 534
от 25.09.2006, 19:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 385, Экспертов: 52
В номере:Вопросов: 3, Ответов: 6


Вопрос № 56049: Уважаемые эксперты! Скажите, пожалуйста, что такое callback-функции (зачем они нужны, какую роль выполняют, когда используются и т.д.)? И какие виды функций еще бывают (кроме стандартных void, int, char...)? C уважением, worsvch!...
Вопрос № 56106: Пожалуста помогите! Нужно подробное руководство по созданию проектов с БД (желательно Paradox) через ODBC на Microsoft Visual C++ 6.0. В принципе я имею опыт работы с БД, работал с таблицами paradox в Borland Delphi, Borland C++ и с БД Interbase ...
Вопрос № 56109: Всем привет. Нужен кусочек программы которая бы при нажатии на Button1 загружала 1.gif из папки gifs в окно программы с координатами слева и сверху, которые есть в файле 1.txt и введены через пробел (1 10 10 (1-номер гифа, 10-расст слева,10 расст...

Вопрос № 56.049
Уважаемые эксперты! Скажите, пожалуйста, что такое callback-функции (зачем они нужны, какую роль выполняют, когда используются и т.д.)?
И какие виды функций еще бывают (кроме стандартных void, int, char...)?
C уважением, worsvch!
Отправлен: 20.09.2006, 08:20
Вопрос задал: Worsvch (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Www2
Здравствуйте, Worsvch!

Простейший пример: функция сортировки qsort из библиотеки stdlib. Ей нужно передать в качестве одного из параметров функцию для сравнения элементов таблицы. Так вот функция для сравнения элементов и есть callback-функция, она вызывается функцией сортировки, когда нужно сравнить два элемента.

void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));

base - указатель на сортируемую таблицу,
nmemb - количество элементов (строк таблицы),
size - размер одного элемента (строки) таблицы.

int (*compar)(const void *, const void *) - шаблон callback функции, первый и второй параметры - указатели на сравниваемые элементы (строки) таблицы. Функция дожна возвращать целое число
0 - если элементы (строки) равны,
<0 - если первый элемент в отсортированной таблице должен стоять перед вторым,
>0 - если первый элемент в отсортированной таблице должен стоять после второго.

Пусть надо отсортировать массив целых чисел:
int array[10];

//callback-функция для сравнения чисел
int compint(const void *ptr1, const void *ptr2)
{
int *i1 = (int *)ptr1;
int *i2 = (int *)ptr2;
return *i1 - *i2;
}

//Вызов функции qsort для сортировки массива из 10 чисел
qsort(array, 10, sizeof(array[0]), compint);

После этого массив целы чисел будет отсортирован в порядке возрастания.

void, int, char - это типы возвражаемого функцией результата, а не "виды функций".
void - ничего не возвращает, int - возвращает целое число, char - возвращает байт.

Примеры:

//печатает строку, ничего не возвращает
void print_hello(void)
{
fprintf(stdio, "Hello! ");
}

//Возвращает квадрат числа
int square(int x)
{
return x * x;
}


---------
Нет правил без исключений, правило без исключения - это исключение из правил.
Ответ отправил: Www2 (статус: 10-ый класс)
Ответ отправлен: 20.09.2006, 08:51

Отвечает: ADSota
Здравствуйте, Worsvch!

2. int, char... это просто типы значений возвращаемых функцией... И этот тип может быть любым, какой придумаете.
1. Callback функция - это функция, которая вызывается не из вашего кода. То есть, например вы регистрируете свою функцию, чтобы срабатывала при нажатии на клавишу - то операционная система при нажатии клавиши запустит вашу процедуру.
---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 20.09.2006, 08:55
Оценка за ответ: 5
Комментарий оценки:
Спасибо!
Самый понятный и четкий ответ.
Теперь я понял, что такое callback.
Просто,я задавал этот вопрос и в PHP. но ответ я там совсем не понял

Отвечает: dentist
Здравствуйте, Worsvch!
во первых не виды функций а типы данных возврощаемых функциями.
а callback это, что-то вроде экспорта
---------
"Software is like sex, it's better then it's free" (c) Linus Torvalds
Ответ отправил: dentist (статус: 4-ый класс)
Ответ отправлен: 20.09.2006, 09:34

Отвечает: Morgion
Здравствуйте, Worsvch!
Callback-ф-я - это ф-я определяемая приложением, но вызываемая операционной системой ( в упрощённом варианте). Если относительно Windows, то callback это например WndProc (система вызывает эту ф-ю пр ;и приходе сообщения),EnumChildProc - при вызове EnumChildWindows указывается ещё параметр - адрес этой ф-и. Так же для таймеров могут существовать callback функции.

В принципе можно и без них, но с ними проще и логичнее. Например WndProc может и не быть (если DispatchMessage не вызывать и самому определять повидение программы).
Ответ отправил: Morgion (статус: Студент)
Ответ отправлен: 20.09.2006, 10:21
Оценка за ответ: 5
Комментарий оценки:
Спасибо за подробный ответ!


Вопрос № 56.106
Пожалуста помогите! Нужно подробное руководство по созданию проектов с БД (желательно Paradox) через ODBC на Microsoft Visual C++ 6.0.
В принципе я имею опыт работы с БД, работал с таблицами paradox в Borland Delphi, Borland C++ и с БД Interbase в Borland C++ и через jsp страницы, также работал в MS Access.
Мне нужно работать обязательно через ODBC и в Visual C++ 6.0, так требует учитель.
Отправлен: 20.09.2006, 18:01
Вопрос задал: Mikutu (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Mihasic
Здравствуйте, Mikutu!
С Paradox не имел дела, но если е драйвер в ODBC поставить, то проблем быть не должно.
Наиболее полное описание работы с ODBC, которое я читал - MSDN, но читать там много (хотя как смотреть) и на английском.
Для основ работы с ODBC можешь нагуглить класс CSQLDirect - через него был мой первый опыт работы с ODBC (правда тогда это было MFC приложение, но посмотрев его простой исходник можно разобраться).
Ответ отправил: Mihasic (статус: 8-ой класс)
Ответ отправлен: 20.09.2006, 18:18
Оценка за ответ: 4
Комментарий оценки:
MSDN у меня стоит, но я хочу почитать что-нибудь на русском языке. Лучше не использовать доп. комнонентов так как их придется потом тащить в универ и там договариватся с админами чтобы они их поставили, короче это сплошной гиморой


Вопрос № 56.109
Всем привет.
Нужен кусочек программы которая бы при нажатии на Button1 загружала 1.gif из папки gifs в окно программы с координатами слева и сверху, которые есть в файле 1.txt и введены через пробел (1 10 10 (1-номер гифа, 10-расст слева,10 расст сверху)). всем заранее благодарен. и жду вашей помощи. знаю что нужны какие то дополнительные компоненты, установил rxlib.
вот примерно как она должна выглядить.
http://f.foto.radikal.ru/0609/796549ca2f8f.jpg
Отправлен: 20.09.2006, 18:39
Вопрос задал: Nur87 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Sergey A. Wedensky
Здравствуйте, Nur87!
Однако, вопрос у Вас расплывчатый. Под какую платформу пишете (ну ладно, видимо винды:), на чем (понятно, на C, судя по теме рассылки) - MFC, .NET, чистый WinAPI?
Если предположить, что пишете под Win32 на чистом API...

Ну, с чтением из текстового файла, думаю, проблем не возникает:
см. #1 в приложении.

Прочитать GIF можно, например, с помощью GDI+ (входит в поставку Win2000 и выше). Конструируете объект Bitmap (из пространства имен Gdiplus) из имени файла, получаете у него HBITMAP (дескриптор GDI), копируете его (чтобы можно было уничтожить Bitmap):
см. #1 в приложении.

Ну, а отобразить его проще всего, наверно, в контроле STATIC со стилем SS_BITMAP на диалоговом окне. Поместить этот контрол в нужные координаты можно при помощи SetWindowPos, например:
см. #3 в приложении.
Если у Вас не диалог, можно обрабатывать WM_PAINT и рисовать картинку в DC окна (BitBlt()), а можно тоже создать дочерний STATIC, или еще как угодно.

Дерзайте.

Приложение:

Ответ отправил: Sergey A. Wedensky (статус: 2-ой класс)
Ответ отправлен: 20.09.2006, 19:19


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.36 от 06.09.2006
Яндекс Rambler's Top100

В избранное