[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