{ Типы данных для реализации метода сжатия Лемпеля-Зива } {--------------------------------------------------------------------------- (c) Copyright Aleksandrov O.E., 2000 Molecular Physics department, USTU, Ekaterinsburg, K-2, 620002, RUSSIA phone 75-47-15 E-mail: aleks@dpt.ustu.ru (c) Copyright Александров О.Е., 2000 620002, Екатеринбург, К-2, УГТУ, Кафедра молекулярной физики тел. 75-47-15 E-mail: aleks@dpt.ustu.ru ----------------------------------------------------------------------------} { ╥шя√ фрээ√ї фы  ЁхрышчрЎшш ьхЄюфр ёцрЄш  ╦хьяхы -╟штр } {--------------------------------------------------------------------------- (c) Copyright Aleksandrov O.E., 2000 Molecular Physics department, USTU, Ekaterinsburg, K-2, 620002, RUSSIA phone 75-47-15 E-mail: aleks@dpt.ustu.ru (c) Copyright └ыхъёрэфЁют ╬.┼., 2000 620002, ┼ърЄхЁшэсєЁу, ╩-2, ╙├╥╙, ╩рЇхфЁр ьюыхъєы Ёэющ Їшчшъш Єхы. 75-47-15 E-mail: aleks@dpt.ustu.ru ----------------------------------------------------------------------------} Unit LZTypes; INTERFACE USES ComTypes; const { Размер словаря в байтах } { ╨рчьхЁ ёыютрЁ  т срщЄрї } cMaxDictionarySize={$IfNDef Delphi}High(word)-64{$ELSE}High(integer)-1024{$EndIf}; { ПУСТАЯ ссылка для узла } { ╧╙╤╥└▀ ёё√ыър фы  єчыр } cNilIndex=0; { ----------- Специальные коды: } { ----------- ╤яхЎшры№э√х ъюф√: } { ОЧИСТКА СЛОВАРЯ Байт следует за кодом и имеет фиксированный размер 8 бит. } { ╬╫╚╤╥╩└ ╤╦╬┬└╨▀ ┴рщЄ ёыхфєхЄ чр ъюфюь ш шьххЄ ЇшъёшЁютрээ√щ ЁрчьхЁ 8 сшЄ. } cCode_ResetDictionary=0; { УВЕЛИЧИТЬ ДЛИНУ КОДА на N БИТ. Число N следует за кодом и имеет фиксированный размер 5 бит. } { ╙┬┼╦╚╫╚╥▄ ─╦╚═╙ ╩╬─└ эр N ┴╚╥. ╫шёыю N ёыхфєхЄ чр ъюфюь ш шьххЄ ЇшъёшЁютрээ√щ ЁрчьхЁ 5 сшЄ. } cCode_IncCodeLength=1; { НОВЫЙ БАЙТ. Байт следует за кодом и имеет фиксированный размер 8 бит. } { ═╬┬█╔ ┴└╔╥. ┴рщЄ ёыхфєхЄ чр ъюфюь ш шьххЄ ЇшъёшЁютрээ√щ ЁрчьхЁ 8 сшЄ. } cCode_NewByte=2; { ------------- End - Специальные коды: } { ------------- End - ╤яхЎшры№э√х ъюф√: } { Индекс корневого узла } { ╚эфхъё ъюЁэхтюую єчыр } cRootIndex=2; { Начальная длина кода в битах } { ═рўры№эр  фышэр ъюфр т сшЄрї } {$IfNDef ByteAlignedOtput} cInitialCodeLength= 2; cCodeLengthIncrementLength=5; {$Else} cInitialCodeLength=8; cCodeLengthIncrementLength=8; {$EndIf NDef ByteAlignedOtput} type { Типы для словаря ------------------- } { ╥шя√ фы  ёыютрЁ  ------------------- } { Описание устройства словаря. Словарь содержит известные фрагменты текста для замены их кодами. Построен словарь в форме многосвязного дерева. Причина - экономия ресурсов. Можно конечно хранить фрагменты в виде строк: abc abcd abd ... Назовем это "простым" словарем. По "простой" словарь слишком расточителен в использовании памяти, поскольку повторы начала фрагментов неизбежны. Экономнее хранить фрагменты посимвольно в виде многосвязного дерева, например так: ┌───┐ │ b │ ├───│ ┌─┐ │ c │ │а│─┼───┤ └─┘ │ d │ ┌───┐ ├───┤ │ f │ │...│ ├───┤ ├───┤ │ g │ │ j │──┼───┤ └───┘ │...│ └───┘ начало фрагмента (первый символ) содержит ссылку на таблицу-продолжение, которая содержит список символов-продолжений фрагмента (все существующие вторые символы). Каждый следующий символ тоже может иметь таблицу-продолжение или не иметь, если продолжения фрагмента нет. И так далее до бесконечности. Таблицу-продолжение можно тоже построить "просто" - в виде строки из 256 символов, но такое устройство будет слишком расточительным с позиции размера памяти. Таблица-продолжение должна быть динамической (т.е. расширяемой на ходу) для наращивания словаря фрагментов и упорядоченной - для ускорения поиска продолжения фрагмента в ней. Указанным требованиям удовлетворяет таблица-продолжение в форме балансированного двоичного дерева. Тогда поиск продолжения в ней займет не более log_2(число_узлов_в_дереве) шагов (для максимального числа 256 узлов - это 8 шагов). Например, для таблицы-продолжения в виде: ┌─┬─┬─┬─┬─┬─┬─┬───────────────────────────────────────┐ │a│c│f│j│m│r│x│ │ └─┴─┴─┴─┴─┴─┴─┴───────────────────────────────────────┘ дерево будет выглядеть так: ┌──┐ │j │ └┬┬┘ ┌─────────┘└────────┐ ┌─┴─┐ ┌─┴─┐ │ c │ │ r │ └┬─┬┘ └┬─┬┘ ┌──────┘ └────┐ ┌───┘ └──────┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ │ a │ │ f │ │ m │ │ x │ └───┘ └───┘ └───┘ └───┘ Поиск в таком дерево осуществляется очень быстро. Двоичным дерево называется потому, что каждый вышележащий узел ссылается на два нижележащих. Балансированным дерево называют потому, что слева и справа от любого узла находится одинаковое число нижележащих узлов (при четном общем числе узлов неизбежен дисбаланс на 1 узел, т.е. правильнее сказать - число узлов слева и справа ниже выделенного узла различается не более чем на единицу). Но надо признать, что динамическая перебалансировка дерева при вставке в дерево новых узлов достаточно трудоемка операция. Таким образом словарь состоит из узлов. Каждый узел должен содержать: ┌──────────────────────────────────┐ │ байт (символ) │ ├──────────────────────────────────┤ │ ссылку на предшествующий байт │ - для восстановления фрагмента по коду ├──────────────────────────────────┤ │ ссылку на таблицу-продолжение │ - для записи продолжения фрагмента ├──────────────────────────────────┤ │ ссылку на правый cледующий узел │ - для построения двоичного дерева ├──────────────────────────────────┤ │ ссылку на левый следующий узел │ -/- ├──────────────────────────────────┤ │ данные для балансировки дерева │ - доп. информация по балансировке └──────────────────────────────────┘ двоичного дерева КОДОМ фрагмента является номер последнего узла, принадлежещего фрагменту, в массиве узлов. Поскольку в сумме эти данные составят 9 байт (для ссылки размером в слово - 16 бит), то максимальный размер словаря получится незначительным, около 65000/9 ~ 7000 узлов, а точнее еще меньше, поскольку могут потребоваться дополнительные данные. Для 32-битной программы размер словаря может быть существенно больше. Для максимизации словаря в 16-битной программе, можно разместить данные в виде отдельных массивов, хотя это и усложнит операции с данными. Ниже применено именно такое решение. Программа размещает ПЯТЬ массивов: 1. Bytes ┌──────────────────────────────────┐ │ байт-код символа │ └──────────────────────────────────┘ 2. Nodes ┌──────────────────────────────────┐ │ ссылка на правый cледующий узел │ - структура двоичного дерева ├──────────────────────────────────┤ │ ссылка на левый следующий узел │ └──────────────────────────────────┘ 3. Flags ┌──────────────────────────────────┐ │ флаги балансировки │- данные для поддержания сбалансированности дерева └──────────────────────────────────┘ 4. Successors ┌──────────────────────────────────┐ │ ссылку на таблицу-продолжение │ - для записи продолжения фрагмента └──────────────────────────────────┘ 5. Predecessors ┌──────────────────────────────────┐ │ ссылку на предшествующий байт │ - для восстановления фрагмента по коду └──────────────────────────────────┘ В этом случае размер словаря для 16-битной адресации чуть более 16000 узлов. Лимитирует размер элемента массива Nodes (4 байта). Можно конечно разбить этот массив на 2 отдельных массива (тогда максимально возможный размер 32000 узлов), но в нашем случае (учебные задачи) это излишнее усложнение. ОСОБЕННОСТИ ТЕРМИНОЛОГИИ: Далее будут различаться термины: "Корень дерева" (Root) и "корневой узел дерева" (RootNode). "Корень дерева" (Root) - означает узел, для которого дерево является продолжением, он не принадлежит дереву, а является его предшествующим узлом. "Корневой узел дерева" (RootNode) - означает узел, являющийся корневым узлом дерева, он принадлежит дереву. "Корень дерева (ссылка)" (RootRef) - означает ячейку памяти, в которой находится ссылка на "корневой узел дерева". Узел идентифицируется по номеру (Index) в массиве узлов. Соотношение между понятиями "Корень дерева" (Root) и "Корневой узел дерева" (RootNode): RootNodeIndex = Successors^[RootIndex]; RootIndex = Predecessors^[RootNodeIndex]; RootIndex = Predecessors^[любой Index для принадлежащего дереву RootNodeIndex узла]; } { ╬яшёрэшх єёЄЁющёЄтр ёыютрЁ . ╤ыютрЁ№ ёюфхЁцшЄ шчтхёЄэ√х ЇЁруьхэЄ√ ЄхъёЄр фы  чрьхэ√ шї ъюфрьш. ╧юёЄЁюхэ ёыютрЁ№ т ЇюЁьх ьэюуюёт чэюую фхЁхтр. ╧Ёшўшэр - ¤ъюэюьш  ЁхёєЁёют. ╠юцэю ъюэхўэю їЁрэшЄ№ ЇЁруьхэЄ√ т тшфх ёЄЁюъ: abc abcd abd ... ═рчютхь ¤Єю "яЁюёЄ√ь" ёыютрЁхь. ═ю "яЁюёЄющ" ёыютрЁ№ ёыш°ъюь ЁрёЄюўшЄхыхэ т шёяюы№чютрэшш ярь Єш, яюёъюы№ъє яютЄюЁ√ эрўрыр ЇЁруьхэЄют эхшчсхцэ√. ▌ъюэюьэхх їЁрэшЄ№ ЇЁруьхэЄ√ яюёшьтюы№эю т тшфх ьэюуюёт чэюую фхЁхтр, эряЁшьхЁ Єръ: ----м ж b ж +---ж --м ж c ж жрж-+---+ L-- ж d ж ----м +---+ ж f ж ж...ж +---+ +---+ ж g ж ж j ж--+---+ L---- ж...ж L---- эрўрыю ЇЁруьхэЄр (яхЁт√щ ёшьтюы) ёюфхЁцшЄ ёё√ыъє эр ЄрсышЎє-яЁюфюыцхэшх, ъюЄюЁр  ёюфхЁцшЄ ёяшёюъ ёшьтюыют-яЁюфюыцхэшщ ЇЁруьхэЄр (тёх ёє∙хёЄтє■∙шх тЄюЁ√х ёшьтюы√). ╩рцф√щ ёыхфє■∙шщ ёшьтюы Єюцх ьюцхЄ шьхЄ№ ЄрсышЎє-яЁюфюыцхэшх шыш эх шьхЄ№, хёыш яЁюфюыцхэш  ЇЁруьхэЄр эхЄ. ╚ Єръ фрыхх фю схёъюэхўэюёЄш. ╥рсышЎє-яЁюфюыцхэшх ьюцэю Єюцх яюёЄЁюшЄ№ "яЁюёЄю" - т тшфх ёЄЁюъш шч 256 ёшьтюыют, эю Єръюх єёЄЁющёЄтю сєфхЄ ёыш°ъюь ЁрёЄюўшЄхы№э√ь ё яючшЎшш ЁрчьхЁр ярь Єш. ╥рсышЎр-яЁюфюыцхэшх фюыцэр с√Є№ фшэрьшўхёъющ (Є.х. Ёрё°шЁ хьющ эр їюфє) фы  эрЁр∙штрэш  ёыютрЁ  ЇЁруьхэЄют ш єяюЁ фюўхээющ - фы  єёъюЁхэш  яюшёър яЁюфюыцхэш  ЇЁруьхэЄр т эхщ. ╙ърчрээ√ь ЄЁхсютрэш ь єфютыхЄтюЁ хЄ ЄрсышЎр-яЁюфюыцхэшх т ЇюЁьх срырэёшЁютрээюую фтюшўэюую фхЁхтр. ╥юуфр яюшёъ яЁюфюыцхэш  т эхщ чрщьхЄ эх сюыхх log_2(ўшёыю_єчыют_т_фхЁхтх) °руют (фы  ьръёшьры№эюую ўшёыр 256 єчыют - ¤Єю 8 °руют). ═ряЁшьхЁ, фы  ЄрсышЎ√-яЁюфюыцхэш  т тшфх: --+-+-+-+-+-+-+---------------------------------------м жaжcжfжjжmжrжxж ж --+-+-+-+-+-+-+---------------------------------------- фхЁхтю сєфхЄ т√уы фхЄ№ Єръ: ---м жj ж ---- -----------+--------м --+-- --+-м ж c ж ж r ж ----- ----- --------+-----м -----+-------м --+-м --+-м --+-м --+-м ж a ж ж f ж ж m ж ж x ж ----- ----- ----- ----- ╧юшёъ т Єръюь фхЁхтю юёє∙хёЄты хЄё  юўхэ№ с√ёЄЁю. ─тюшўэ√ь фхЁхтю эрч√трхЄё  яюЄюьє, ўЄю ърцф√щ т√°хыхцр∙шщ єчхы ёё√ырхЄё  эр фтр эшцхыхцр∙шї. ┴рырэёшЁютрээ√ь фхЁхтю эрч√тр■Є яюЄюьє, ўЄю ёыхтр ш ёяЁртр юЄ ы■сюую єчыр эрїюфшЄё  юфшэръютюх ўшёыю эшцхыхцр∙шї єчыют (яЁш ўхЄэюь юс∙хь ўшёых єчыют эхшчсхцхэ фшёсрырэё эр 1 єчхы, Є.х. яЁртшы№эхх ёърчрЄ№ - ўшёыю єчыют ёыхтр ш ёяЁртр эшцх т√фхыхээюую єчыр ЁрчышўрхЄё  эх сюыхх ўхь эр хфшэшЎє). ═ю эрфю яЁшчэрЄ№, ўЄю фшэрьшўхёър  яхЁхсрырэёшЁютър фхЁхтр яЁш тёЄртъх т фхЁхтю эют√ї єчыют фюёЄрЄюўэю ЄЁєфюхьър юяхЁрЎш . ╥ръшь юсЁрчюь ёыютрЁ№ ёюёЄюшЄ шч єчыют. ╩рцф√щ єчхы фюыцхэ ёюфхЁцрЄ№: -----------------------------------м ж срщЄ (ёшьтюы) ж +----------------------------------+ ж ёё√ыъє эр яЁхф°хёЄтє■∙шщ срщЄ ж - фы  тюёёЄрэютыхэш  ЇЁруьхэЄр яю ъюфє +----------------------------------+ ж ёё√ыъє эр ЄрсышЎє-яЁюфюыцхэшх ж - фы  чряшёш яЁюфюыцхэш  ЇЁруьхэЄр +----------------------------------+ ж ёё√ыъє эр яЁрт√щ cыхфє■∙шщ єчхы ж - фы  яюёЄЁюхэш  фтюшўэюую фхЁхтр +----------------------------------+ ж ёё√ыъє эр ыхт√щ ёыхфє■∙шщ єчхы ж -/- +----------------------------------+ ж фрээ√х фы  срырэёшЁютъш фхЁхтр ж - фюя. шэЇюЁьрЎш  яю срырэёшЁютъх L----------------------------------- фтюшўэюую фхЁхтр ╩╬─╬╠ ЇЁруьхэЄр  ты хЄё  эюьхЁ яюёыхфэхую єчыр, яЁшэрфыхцх∙хую ЇЁруьхэЄє, т ьрёёштх єчыют. ╧юёъюы№ъє т ёєььх ¤Єш фрээ√х ёюёЄрт Є 9 срщЄ (фы  ёё√ыъш ЁрчьхЁюь т ёыютю - 16 сшЄ), Єю ьръёшьры№э√щ ЁрчьхЁ ёыютрЁ  яюыєўшЄё  эхчэрўшЄхы№э√ь, юъюыю 65000/9 ~ 7000 єчыют, р Єюўэхх х∙х ьхэ№°х, яюёъюы№ъє ьюуєЄ яюЄЁхсютрЄ№ё  фюяюыэшЄхы№э√х фрээ√х. ─ы  32-сшЄэющ яЁюуЁрьь√ ЁрчьхЁ ёыютрЁ  ьюцхЄ с√Є№ ёє∙хёЄтхээю сюы№°х. ─ы  ьръёшьшчрЎшш ёыютрЁ  т 16-сшЄэющ яЁюуЁрььх, ьюцэю ЁрчьхёЄшЄ№ фрээ√х т тшфх юЄфхы№э√ї ьрёёштют, їюЄ  ¤Єю ш єёыюцэшЄ юяхЁрЎшш ё фрээ√ьш. ═шцх яЁшьхэхэю шьхээю Єръюх Ёх°хэшх. ╧ЁюуЁрььр Ёрчьх∙рхЄ ╧▀╥▄ ьрёёштют: 1. Bytes -----------------------------------м ж срщЄ-ъюф ёшьтюыр ж L----------------------------------- 2. Nodes -----------------------------------м ж ёё√ыър эр яЁрт√щ cыхфє■∙шщ єчхы ж - ёЄЁєъЄєЁр фтюшўэюую фхЁхтр +----------------------------------+ ж ёё√ыър эр ыхт√щ ёыхфє■∙шщ єчхы ж L----------------------------------- 3. Flags -----------------------------------м ж Їыруш срырэёшЁютъш ж- фрээ√х фы  яюффхЁцрэш  ёсрырэёшЁютрээюёЄш фхЁхтр L----------------------------------- 4. Successors -----------------------------------м ж ёё√ыър эр ЄрсышЎє-яЁюфюыцхэшх ж - фы  чряшёш яЁюфюыцхэш  ЇЁруьхэЄр L----------------------------------- 5. Predecessors -----------------------------------м ж ёё√ыър эр яЁхф°хёЄтє■∙шщ срщЄ ж - фы  тюёёЄрэютыхэш  ЇЁруьхэЄр яю ъюфє L----------------------------------- ┬ ¤Єюь ёыєўрх ЁрчьхЁ ёыютрЁ  фы  16-сшЄэющ рфЁхёрЎшш ўєЄ№ сюыхх 16000 єчыют. ╦шьшЄшЁєхЄ ЁрчьхЁ ¤ыхьхэЄр ьрёёштр Nodes (4 срщЄр). ╠юцэю ъюэхўэю ЁрчсшЄ№ ¤ЄюЄ ьрёёшт эр 2 юЄфхы№э√ї ьрёёштр (Єюуфр ьръёшьры№эю тючьюцэ√щ ЁрчьхЁ 32000 єчыют), эю т эр°хь ёыєўрх (єўхсэ√х чрфрўш) ¤Єю шчыш°эхх єёыюцэхэшх. ╬╤╬┴┼══╬╤╥╚ ╥┼╨╠╚═╬╦╬├╚╚: ─рыхх сєфєЄ ЁрчышўрЄ№ё  ЄхЁьшэ√: "╩юЁхэ№ фхЁхтр" (Root) ш "ъюЁэхтющ єчхы фхЁхтр" (RootNode). "╩юЁхэ№ фхЁхтр" (Root) - ючэрўрхЄ єчхы, фы  ъюЄюЁюую фхЁхтю  ты хЄё  яЁюфюыцхэшхь, юэ эх яЁшэрфыхцшЄ фхЁхтє, р  ты хЄё  хую яЁхф°хёЄтє■∙шь єчыюь. "╩юЁэхтющ єчхы фхЁхтр" (RootNode) - ючэрўрхЄ єчхы,  ты ■∙шщё  ъюЁэхт√ь єчыюь фхЁхтр - єчхы эр ъюЄюЁ√щ эхЄ ёё√ыюъ т фхЁхтх, юэ яЁшэрфыхцшЄ фхЁхтє. "╩юЁхэ№ фхЁхтр (ёё√ыър)" (RootRef) - ючэрўрхЄ  ўхщъє ярь Єш, т ъюЄюЁющ эрїюфшЄё  ёё√ыър эр "ъюЁэхтющ єчхы фхЁхтр". ╙чхы шфхэЄшЇшЎшЁєхЄё  яю эюьхЁє (Index) т ьрёёштх єчыют. ╤ююЄэю°хэшх ьхцфє яюэ Єш ьш "╩юЁхэ№ фхЁхтр" (Root) ш "╩юЁэхтющ єчхы фхЁхтр" (RootNode): RootNodeIndex = Successors^[RootIndex]; RootIndex = Predecessors^[RootNodeIndex]; RootIndex = Predecessors^[ы■сющ Index фы  яЁшэрфыхцр∙хую фхЁхтє RootNodeIndex єчыр]; } { Флаг балансировки } { ╘ыру срырэёшЁютъш - тёяюьюурЄхы№э√х фрээ√х фы  тёЄртъш ё ёюїЁрэхэшхь срырэёшЁютъш} tNodeFlag=(nfRight); tNodeFlags=set of tNodeFlag; { Номер узла } { ═юьхЁ єчыр } tNodeIndex={$IfNDef Delphi}word{$ELSE}cardinal{$EndIf}; tPNodeIndex=^tNodeIndex; { Узел для определения размера } { ╙чхы фы  юяЁхфхыхэш  ЁрчьхЁр } tXNode=packed record Left,Right:tNodeIndex; end; { Номер узла в массиве узлов } { ═юьхЁ єчыр т ьрёёштх єчыют } tIndex=0..(cMaxDictionarySize div (SizeOf(tXNode))); tDoubleIndex={$IfNDef Delphi}longint{$ELSE}int64{$EndIf}; tPIndex=^tIndex; { Узел } { ╙чхы } tNode=packed record case byte of 0:(Left,Right:tIndex); 1:(LeftRight:array[boolean] of tIndex); end; tPNode=^tNode; { Длина кода в битах } { ─ышэр ъюфр т сшЄрї } tCodeLength=0..8*SizeOf(tIndex); { массивы } { ьрёёшт√ } tNodesArray=packed array[tIndex] of tNode; tPNodesArray=^tNodesArray; tBytesArray=array[tIndex] of tByte; tPBytesArray=^tBytesArray; tFlagsArray=packed array[tIndex] of tNodeFlags; tPFlagsArray=^tFlagsArray; tLineReferenciesArray=packed array[tIndex] of tIndex; tPLineReferenciesArray=^tLineReferenciesArray; { данные о размере словаря } { фрээ√х ю ЁрчьхЁх ёыютрЁ  } tDictionaryDescriptors=packed record Max:tIndex; { максимальный размер словаря в узлах } { ьръёшьры№э√щ ЁрчьхЁ ёыютрЁ  т єчырї } FirstFree:tIndex; { первый свободный узел словаря } { яхЁт√щ ётюсюфэ√щ єчхы ёыютрЁ  } end; { основные данные словаря } { юёэютэ√х фрээ√х ёыютрЁ  } tDictionary=packed record Descriptors:tDictionaryDescriptors; { описание размеров словаря } { юяшёрэшх ЁрчьхЁют ёыютрЁ  } Bytes:tPBytesArray; { байты дерева }{ срщЄ√ фхЁхтр } Nodes:tPNodesArray; { бинарное дерево }{ сшэрЁэюх фхЁхтю } Flags:tPFlagsArray; { флаги балансировки дерева } { Їыруш срырэёшЁютъш фхЁхтр } Successors:tPLineReferenciesArray; { прямая связь фрагментов } { яЁ ьр  ёт ч№ ЇЁруьхэЄют } Predecessors:tPLineReferenciesArray; { обратная связь фрагментов } { юсЁрЄэр  ёт ч№ ЇЁруьхэЄют } end; tPDictionary=^tDictionary; const cNullNode:tNode=(Left:cNilIndex; Right:cNilIndex); { Типы для словаря --END----------------- } { ╥шя√ фы  ёыютрЁ  --END----------------- } const { Размер tIndex в битах } { ╨рчьхЁ tIndex т сшЄрї } cSizeOftIndexInBit=8*SizeOf(tIndex); type tIndexBitsCounter=0..cSizeOftIndexInBit; tIndexBitsNumber=0..Pred(cSizeOftIndexInBit); IMPLEMENTATION END.