Другие языки программирования и технологии

Вопрос программистам С/С++ (да и не только) №3

Навеяно вашим вопросом о кодировании по Хаффману и аннотацией на официальном сайте архиватора FreeArc.
Пример чисто умозрительный и, возможно, притянут за уши.

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

Идея состоит в том, что функция-анализатор вместо установки десятков флажков в зависимости от типа обрабатываемого на текущий момент файла для последующего анализа этих флагов (фактически повторно) функцией-диспетчером и вызова с помощью условных переходов соответствующих алгоритмов, возвращает указатель на массив указателей последовательно вызываемых функций-обработчиков.
В программе предварительно должен быть сформирован массив массивов указателей на функции в зависимости от типов файлов.
Например, для растровых монохромных изображений, mp3 и подобных не байт/слово ориентированных форматов - это может быть один алгоритм сжатия LZW.
Для полноцветных битмапов, скажем, RLE с последующим Хаффманом.
Для аудиофайлов наподобие wav - delta-кодирование и LZW.
Для текстовых - PPMd.
Для сжатых изображений (jpeg) - восстановление растра, обработка его MTF и последующее арифметическое кодирование. Причём, возможна обработка служебной информации (EXIF) другим алгоритмом (пусть LZX).
Для исполняемых файлов - BCJ и LZMA.
И т. д.

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

Как-то так. Считайте, что комбинации алгоритмов для различных типов файлов, взяты мной с потолка.
ОН
Олег Николаев
51 590
Лучший ответ
Владислав Андреянов Здорово! Это уже есть что-то интересное и отличное от системных задач!
Самое, что интересное, что массив указателей в этом случае имеет смысл для существования, если есть функции, указатели на которые хранятся в массивах, встречаются иногда в разном порядке в этих массивах. То есть для решения задачи разархивирования для разных алгоритмов сжатия могут выполняться иногда одинаковые функции, но вызываемые для каждого алгоритма в своей очерёдности!
Кстати, я тут намекнул ещё на один способ применения, который хотел услышать! :)
Но за этот ответ спасибо! Ответ очень понравился!
Массив указателей на функции часто используется в системных задачах - например, список прерываний, шлюзов и т. д.
Соответственно, вполне естественно предположить, что если обращение к таблице прерываний реализовано функцией, то вернет она именно такую структуру.
Кстати, что-то похожее может возникнуть при реализации ООП на чистом C - таблицу функций надо где-то хранить.
Владислав Андреянов С массивом указателей всё понятно. Речь идёт о функции, возвращающей указатель. Если Вы говорите о таблице прерываний (хотя там делается это по другому, ну да ладно) то, возвращая указатель, предполагаем, что у нас этих таблиц несколько! Иначе смысла нет возвращать указатель на единственную таблицу. Тогда тут следует следующий вопрос. Зачем нам несколько таблиц с прерываниями?