Четвертый BORLAND С++ и его окружение

       

Улучшение алгоритма


Хотя наш алгоритм работает чудесно, но он довольно ограничен в

своих возможностях, так как может декомпрессировать только непосредственно на экран. Поскольку цикл while находится в функции, то

ограничения на время декомпрессии один шаг за цикл. Например, предположим вы хотите работать декомпрессором как фильтром (в стиле UNIX),

и пропускаете текст для декомпрессии один символ за цикл времени к

анализатору:

сжатый текст -> Декомп > Анализ. > лексемы

фильтр симв.

Это сделает наш декомпрессор весьма гибким и переносимым. Как мы

можем изменить наш алгоритм, написанный на Си?

Чтобы алгоритм на Си сделать более гибким необходимо воспользоваться возможностями ООП. Сперва дополним нашу функцию decomp() локальными переменными, и поместим их в структуру. Эта структура будет

также содержать указатель на строку, которую необходимо декомпрессировать, и длину этой строки:

typedef struct {

> int srclen, c, rcnt; <



> unsigned char *p;

} decompressor;

void decomp(unsigned char *s, int srclen)

{ ----------

int | c, rcnt; |

----------

...

}

Примечание:

Теперь попробуем расщепить нашу функцию decomp() на две части:

функцию инициализации и функцию возвращающую следующий символ, с автоматическим включением его в процесс декомпрессии. Далее передадим

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

Сначала опишем функцию инициализации:

void decompressor_init(decompressor* dc, unsigned char* s, int len)

{

dc->p = s; /* Место сжатия строки */

dc->srclen = len; /* Инициализация переменной содержащей длину */

dc->rcnt = 0; /* Обнуление счетчика длины строки */

}



Содержание раздела