На странице html:
document.write("<br>");
, но если вы находитесь в файле JavaScript, это будет работать как новая строка:
document.write("\n");
Нет никакого "обратного вызова" в 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 и присвоит возвращенные значения элементам в данном массиве.
Вот пример обратных вызовов в 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);
Этот статья Википедии имеет пример в C.
А хороший пример - то, что новые модули, записанные для увеличения регистра веб-сервера Apache с основным апачским процессом путем передачи их указатели функции так те функции, призваны обратно для обработки запросов веб-страницы.
Обычно это может быть сделано при помощи указателя функции, который является специальной переменной, которая указывает на ячейку памяти функции. Можно тогда использовать это для вызывания функции с определенными аргументами. Таким образом, вероятно, будет функция, которая устанавливает функцию обратного вызова. Это примет указатель функции и затем сохранит тот адрес где-нибудь, где он может использоваться. После этого, когда указанное событие инициировано, оно вызовет ту функцию.
Обратные вызовы в C обычно реализуются с помощью указателей функции и связанного указателя данных. Вы передаете свою функцию on_event()
и указатели данных на функцию платформы watch_events()
(например). Когда случай происходит, Ваша функция вызвана с Вашими данными и некоторыми определенными для события данными.
Обратные вызовы также используются в программировании GUI. GTK + учебное руководство имеет хороший раздел по теория сигналов и обратных вызовов .