1.10 Упражнения

Предыдущая  Содержание  Следующая V*D*V

Если объект может принадлежать нескольким наборам одновременно, необходимо другое представление для наборов. Если мы по-прежнему представляем объекты как небольшие уникальные целочисленные значения, и если есть предел на количество объектов, можно представить набор в виде битового массива, сохранённого в длинную строку символов, где выбранный значением объекта бит установлен или очищен в зависимости от наличия объекта в наборе.

Более универсальное и более традиционное решение представляет набор как линейный список узлов, хранящих адреса объектов в наборе. Это не накладывает никаких ограничений на объекты и позволяет реализовать набор, не зная представление объекта.

Для отладки иметь возможность посмотреть на отдельные объекты очень полезно. Разумное универсальное решение представляет собой две функции

 

int store (const void * object, FILE * fp);

int storev (const void * object, va_list ap);

 

store() записывает описание объекта в файл. storev() для получения указателя на файл из списка аргументов, на который указывает ap, использует va_arg(). Обе функции возвращают количество записанных символов. storev() станет удобной, если мы реализуем для наборов следующую функцию:

 

int apply (const void * set,

    int (* action) (void * object, va_list ap), ...);

 

apply() вызывает action() для каждого элемента в наборе и передаёт остальную часть списка аргументов. action() не должна изменять набор, однако она может вернуть ноль, чтобы остановить работу apply() раньше. apply() возвращает истину, если были обработаны все элементы.

Предыдущая  Содержание  Следующая