Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Не могу распознать как применили typedef


Автор: Barts 6.4.2013, 12:42
Подскажите как это в теории называется !!! 

typedef void QEMUResetHandler(void *opaque);

void qemu_register_reset(QEMUResetHandler *func, void *opaque);
void qemu_unregister_reset(QEMUResetHandler *func, void *opaque);

что почитать? прошуршал уже много в интернете. просто не могу сформулировать ((( . Очень надеюсь на Вашу помощь

Добавлено через 9 минут и 56 секунд
что-то типа callback Функции?? ... 

Автор: Barts 6.4.2013, 13:35
это в исходниках Qemu найдено... там такого добра полно

Автор: ChihPih 6.4.2013, 14:07
Тупо объявили прототип функции в виде своего типа.

Автор: Barts 6.4.2013, 14:21
Цитата(ChihPih @ 6.4.2013,  14:07)
Тупо объявили прототип функции в виде своего типа.

ну а работает конструкция типа как callback-функция???

Автор: borisbn 6.4.2013, 16:17
Цитата(Barts @  6.4.2013,  12:42 Найти цитируемый пост)
typedef void QEMUResetHandler(void *opaque);

хммм... первый раз вижу такое...
такое:
Код
typedef void (QEMUResetHandler*)(void *);

абсолютно понятно. а в оригинале - хз.

Bartss - means Simpson ? Cool, if yes  smile 

Автор: ChihPih 6.4.2013, 16:42
Цитата(Barts @  6.4.2013,  17:21 Найти цитируемый пост)
ну а работает конструкция типа как callback-функция???

Не совсем понял что подразумевается под callback-функцией. в общем можно писать так:
Код

typedef void QEMUResetHandler(void *opaque);

void myQEMUResetHandler(void *opaque); // где-то она там реализована...

void some_func(){
  // ....
  qemu_register_reset(myQEMUResetHandler, someptr);
  // ....
}

// Где-то в функции qemu_register_reset есть:
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
{
  // ....
  func(opaque);
  // ....
}

Автор: Barts 6.4.2013, 16:55
Цитата

хммм... первый раз вижу такое...

я это в исходниках на qemu отрыл. То ж не видел, не гадал. Например, чтобы проверить меня, можете скачать из удаленного репозитория последнюю версию Qemu:
git clone git://git.qemu-project.org/qemu.git    ну либо из tar-архивов достать исходники: http://wiki.qemu.org/Download

так вот например в папке куда скачаются исходники, есть файл ./hw/hw.h Вот Оттуда и взят данный пример объявления. А описание функции лежит в файле ./vl.c

Код

void qemu_register_reset(QEMUResetHandler *func, void *opaque)
{
    QEMUResetEntry *re = g_malloc0(sizeof(QEMUResetEntry));

    re->func = func;
    re->opaque = opaque;
    QTAILQ_INSERT_TAIL(&reset_handlers, re, entry);
}


хочу понять дзен просто

Добавлено @ 17:03
ChihPih, Спасибо Вам за пример. Да судя по Вашему примеру, да и по исследуемым исходникам - так оно и делается. Просто хочу понять не просто механически что как делать...

Цитата

Не совсем понял что подразумевается под callback-функцией

Callback ( обратный вызов ) — передача исполняемого кода в качестве одного из параметров другого кода. Обратный вызов позволяет внутри отдельных процедур исполнять код, определённый в других контекстах программного кода, то есть код недоступный в этих процедурах для прямого вызова. Кроме того, некоторые алгоритмические задачи в качестве своих входных данных имеют не только числа или объекты, но и действия (алгоритмы). Например, задача обхода двоичного дерева с применением некоторого действия к каждому узлу дерева. Обратный вызов в этих задачах может выступать в роли этого действия (алгоритма)

Автор: Barts 6.4.2013, 17:27
Цитата(borisbn @  6.4.2013,  16:17 Найти цитируемый пост)
typedef void (QEMUResetHandler*)(void *);

Уважаемый, borisbn ! если Вы имел ив виду указатель на функцию, быть может так надо было ??...
Код

typedef void (*QEMUResetHandler)(void *);




Автор: Barts 6.4.2013, 18:39
вот ссылочка, которая вместе со здешними ответами прольет свет. http://club.shelek.ru/viewart.php?id=270  
буду курить. 
Спасибо Всем!

Автор: volatile 6.4.2013, 20:52
Цитата(Barts @  6.4.2013,  17:27 Найти цитируемый пост)
если Вы имел ив виду указатель на функцию, быть может так надо было ??...
typedef void (*QEMUResetHandler)(void *);

да, это тип указателя на функцию.

Цитата(Barts @  6.4.2013,  12:42 Найти цитируемый пост)
typedef void QEMUResetHandler(void *opaque);

соотвественно, это тип того, на что он указывает. т.е сама функция, как тип.


Автор: Barts 6.4.2013, 22:49
Цитата

соотвественно, это тип того, на что он указывает. т.е сама функция, как тип.

спасибо. надо разбираться, чтоб весь ливер устаканился... 

Автор: NoviceF 8.4.2013, 20:03
Цитата(volatile @  6.4.2013,  21:52 Найти цитируемый пост)
соотвественно, это тип того, на что он указывает. т.е сама функция, как тип.


можно чуть более развёрнуто примерами пояснить?

Автор: volatile 8.4.2013, 20:55
Цитата(NoviceF @  8.4.2013,  20:03 Найти цитируемый пост)
можно чуть более развёрнуто примерами пояснить? 

Код

typedef int func_type (const char*);     // Определение типа функции.
func_type my_func;                       // Форвард декларация функции
typedef func_type * ptr_to_func;         // Определение типа указателя на функцию. 

int main() 
{
   my_func ("text");          // Прямой вызов функции

   ptr_to_func ptr = my_func; // Создание и инициализация указателя на функцию
   ptr ("text");              // Вызов функции по указателю
}

должно компилицца.  smile 

где нибудь в другом месте не забудьте определить саму функцию my_func, иначе линковщик не соберет.
Код

// где-нибудь, возможно в другом модуле
int my_func (const char*  text)
{
   printf ("%s\n", text);
}

Автор: NoviceF 9.4.2013, 09:45
volatile, спасибо, как выдастся время, попробую осмыслить smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)