Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу распознать как применили typedef, то ли указатель на функцию, то ли... 
:(
    Опции темы
Barts
Дата 6.4.2013, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Подскажите как это в теории называется !!! 

typedef void QEMUResetHandler(void *opaque);

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

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

Добавлено через 9 минут и 56 секунд
что-то типа callback Функции?? ... 
PM MAIL   Вверх
Barts
Дата 6.4.2013, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



это в исходниках Qemu найдено... там такого добра полно
PM MAIL   Вверх
ChihPih
Дата 6.4.2013, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

Репутация: нет
Всего: 22



Тупо объявили прототип функции в виде своего типа.

Это сообщение отредактировал(а) ChihPih - 6.4.2013, 14:10


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
Barts
Дата 6.4.2013, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



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

ну а работает конструкция типа как callback-функция???
PM MAIL   Вверх
borisbn
Дата 6.4.2013, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



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

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

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

Bartss - means Simpson ? Cool, if yes  smile 

Это сообщение отредактировал(а) borisbn - 6.4.2013, 16:57


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ChihPih
Дата 6.4.2013, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

Репутация: нет
Всего: 22



Цитата(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);
  // ....
}



--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
Barts
Дата 6.4.2013, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Цитата

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

я это в исходниках на 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:04
PM MAIL   Вверх
Barts
Дата 6.4.2013, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



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

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

typedef void (*QEMUResetHandler)(void *);





Это сообщение отредактировал(а) Barts - 6.4.2013, 17:56
PM MAIL   Вверх
Barts
Дата 6.4.2013, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



вот ссылочка, которая вместе со здешними ответами прольет свет. http://club.shelek.ru/viewart.php?id=270  
буду курить. 
Спасибо Всем!
PM MAIL   Вверх
volatile
Дата 6.4.2013, 20:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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

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

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

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


PM MAIL   Вверх
Barts
Дата 6.4.2013, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Цитата

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

спасибо. надо разбираться, чтоб весь ливер устаканился... 
PM MAIL   Вверх
NoviceF
Дата 8.4.2013, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



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


можно чуть более развёрнуто примерами пояснить?
PM MAIL   Вверх
volatile
Дата 8.4.2013, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(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);
}

PM MAIL   Вверх
NoviceF
Дата 9.4.2013, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



volatile, спасибо, как выдастся время, попробую осмыслить smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1242 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.