Что такое & ldquo; обратный вызов & rdquo; в C и как они реализованы?

На странице html:

document.write("<br>"); 

, но если вы находитесь в файле JavaScript, это будет работать как новая строка:

document.write("\n");
141
задан Sourav Ghosh 23 December 2016 в 15:09
поделиться

5 ответов

Нет никакого "обратного вызова" в C - не больше, чем какая-либо другая универсальная концепция программирования.

Они реализованы с помощью указателей функции. Вот пример:

void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}

int getNextRandomValue(void)
{
    return rand();
}

int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    ...
}

Здесь, populate_array функция берет указатель функции в качестве своего третьего параметра и называет его, чтобы заставить значения заполнять массив с. Мы записали обратный вызов getNextRandomValue, который возвращает значение случайного выхода и передал указатель на него к populate_array. populate_array назовет наши времена функции обратного вызова 10 и присвоит возвращенные значения элементам в данном массиве.

188
ответ дан aib 23 December 2016 в 15:09
поделиться
  • 1
    Проживание в 2011, заставляет меня думать Java 7 won' t имеют закрытия... Если так, Java 7 является ненужным. – Moshe Revah 7 January 2011 в 17:20

Вот пример обратных вызовов в C.

Скажем, Вы хотите записать некоторый код, который позволяет регистрировать обратные вызовы, которые назовут, когда некоторое событие имеет место.

Первый определяют тип функции, используемой для обратного вызова:

typedef void (*event_cb_t)(const struct event *evt, void *userdata);

Теперь, определите функцию, которая используется для регистрации обратного вызова:

int event_cb_register(event_cb_t cb, void *userdata);

Это - то, на что код был бы похож, который регистрирует обратный вызов:

static void my_event_cb(const struct event *evt, void *data)
{
    /* do stuff and things with the event */
}

...
   event_cb_register(my_event_cb, &my_custom_data);
...

Во внутренностях диспетчера события, обратный вызов может быть сохранен в структуре, которая выглядит примерно так:

struct event_cb {
    event_cb_t cb;
    void *data;
};

Это - то, на что код похож, который выполняет обратный вызов.

struct event_cb *callback;

...

/* Get the event_cb that you want to execute */

callback->cb(event, callback->data);
118
ответ дан Russell Bryant 23 December 2016 в 15:09
поделиться

Этот статья Википедии имеет пример в C.

А хороший пример - то, что новые модули, записанные для увеличения регистра веб-сервера Apache с основным апачским процессом путем передачи их указатели функции так те функции, призваны обратно для обработки запросов веб-страницы.

3
ответ дан Leonard 23 December 2016 в 15:09
поделиться
  • 1
    Положительная сторона; моя ошибка. Таким образом, этот ответ весьма корректен относительно состояния Java 7, просто устарел. Что касается lambdaj, по-видимому, очень полезной библиотеки, это обеспечивает что-то как лямбда-выражения, но не закрытия. – Neal Gafter 7 July 2010 в 17:58

Обычно это может быть сделано при помощи указателя функции, который является специальной переменной, которая указывает на ячейку памяти функции. Можно тогда использовать это для вызывания функции с определенными аргументами. Таким образом, вероятно, будет функция, которая устанавливает функцию обратного вызова. Это примет указатель функции и затем сохранит тот адрес где-нибудь, где он может использоваться. После этого, когда указанное событие инициировано, оно вызовет ту функцию.

0
ответ дан mdec 23 December 2016 в 15:09
поделиться
  • 1
    Я соглашаюсь. Теперь кажется, что упрощенная форма Закрытий будет в очень отложенном Java 7. – Peter Lawrey 20 November 2009 в 22:41

Обратные вызовы в C обычно реализуются с помощью указателей функции и связанного указателя данных. Вы передаете свою функцию on_event() и указатели данных на функцию платформы watch_events() (например). Когда случай происходит, Ваша функция вызвана с Вашими данными и некоторыми определенными для события данными.

Обратные вызовы также используются в программировании GUI. GTK + учебное руководство имеет хороший раздел по теория сигналов и обратных вызовов .

4
ответ дан John Millikin 23 December 2016 в 15:09
поделиться
  • 1
    Привет Neal. При чтении даты моего ответа, это было отправлено на сентябре 2009. Это означает, что было за 2 месяца до объявления о закрытии в Java 7 в Devoxx. Если Вы помните в то время практически, что все были уверены что мы won' t имеют закрытие в Java 7. Вы соглашаетесь? Что должно, я сделал после объявления? Посмотрите на всем протяжении Интернета для всех сообщений, где я говорил о закрытии в Java 7 для исправления их? – Mario Fusco 7 July 2010 в 16:53
Другие вопросы по тегам:

Похожие вопросы: