[cdev] Задача 4, 135гр
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Вт Ноя 30 01:20:01 MSK 2010
Объясню.
Очень простая функция, пользователь что-то хранит в массиве - указатели
на свои данные. Ему может понадобиться сделать обход всех этих данных -
по указателям, которые хранятся в массиве. Для этого пользователь пишет
функцию, интерфейс которой соответствует типу parray_callback_t (его мы
определили для удобства в заголовке) а затем натравливает
parray_foreach() на массив. Указатель opaque указывает на произвольные
данные, которые должны потом быть переданы в callback (функцию
пользователя) как последний аргумент. Т.к. функция parray_foreach()
обходит все элементы массива, пользователь может сигнализировать из
своей функции о том что обход можно завершить, вернув не нулевое значение.
Например, пользователь хочет печатать что-то:
static int
print_user_data(void *data, void *opaque)
{
struct user_data *up = (struct user_data *) data;
float *flp = (float *) opaque;
printf("%f %d\n", *flp, up->age)
return 0;
}
Дальше где-то в другом месте:
{
struct parray *pa;
float value;
...
value = 10.0;
parray_foreach(pa, print_user_data, &value);
...
}
Здесь в opaque мы передали адрес переменной, к которой мы потом сможем
получить доступ внутри print_user_data - это для примера. А так там
может быть адрес чего угодно, в этом весь смыл был его делать,
пользовательская функция сама должна разобраться.
По реализации, там всё вроде бы ясно. В цикле обходите массив, дёргаете
callback, смотрите что он вернул, если 0 то продолжаете дальше иначе
завершаете цикл.
--
Г.А.
Ксения Оботурова пишет:
> Григорий Александрович, а объясните еще раз что должна делать эта функция в задаче 4(массив указателей)
>
> /* Traverse pointer array calling callback function for each element. */
> void *parray_foreach(struct parray *pa, parray_callback_t callback, void *opaque);
.
Подробная информация о списке рассылки cdev