Форум: "Потрепаться";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизПерекодировщик Найти похожие ветки
← →
СатирЪ © (2004-08-02 17:20) [0]Возникла необходимость написать перекодировщик.
Выглядит он следующим образом:
TCodec = record
from:byte;
into:string[4];
end;
Const
RTDBCodec:array[0..67] of TCodec =
((45,"_qD"),(46,"_qP"),(163,"_yo"),(179,"_YO"),(192,"_yu"),(193,"_a"),
(194,"_b"),(195,"_c"),(196,"_d"),(197,"_e"),(198,"_f"),(199,"_g"),
(200,"_x"),(201,"_i"),(202,"_y"),(203,"_k"),(204,"_l"),(205,"_m"),
(206,"_n"),(207,"_o"),(208,"_p"),(209,"_ya"),(210,"_r"),(211,"_s"),
(212,"_t"),(213,"_u"),(214,"_zh"),(215,"_v"),(216,"_er"),(217,"_y"),
(218,"_z"),(219,"_sh"),(220,"_ye"),(221,"_sch"),(222,"_ch"),(223,"_er"),
(224,"_YU"),(225,"_A"),(226,"_B"),(227,"_C"),(228,"_D"),(229,"_E"),
(230,"_F"),(231,"_G"),(232,"_X"),(233,"_I"),(234,"_Y"),(235,"_K"),
(236,"_L"),(237,"_M"),(238,"_N"),(239,"_O"),(240,"_P"),(241,"_YA"),
(242,"_R"),(243,"_S"),(244,"_T"),(245,"_U"),(246,"_ZH"),(247,"_V"),
(248,"_ER"),(249,"_Y"),(250,"_Z"),(251,"_SH"),(252,"_YE"),(253,"_SCH"),
(254,"_CH"),(255,"_ER"));
перекодировать по принципу
if Ord(s[i]) in [45,46,163,179,192..255] then //поиск соответствия в массиве.
Но потом пришла мысль, что если объявить массив таким образом
RTDBCodec:array[45,46,163,179,192..255] of string[4]=...
то к елементам массива можно было бы обращаться по коду символов.
То есть s1:=RTDBCodec[Ord(s[i])]
Но, к сожалению, синтаксис языка не позволяет такое определение массива.
Кто знает, как можно обойти это ограничение и упростить общую конструкцию?
ЗЫЖ можно определить массив от 0 до 255 и неиспользуемые ячейки задать пустыми. Но пусть это останется напоследок, если нет других альтернатив.
← →
Sandman25 © (2004-08-02 17:22) [1]Других альтернатив нет.
Только не пустыми, а с содержимым = индекс.
← →
Anatoly Podgoretsky © (2004-08-02 17:26) [2]Класс и индексное свойство
← →
СатирЪ © (2004-08-02 17:45) [3]
> Класс и индексное свойство
это альтернатива массиву?
ладно, сделал пока вот так:
RTDBChar:array[byte]of string[4] =
("",//#0
"","","","","","","","","","","","","","","","","","","","","","",//#22
"","","","","","","","","","","","","","","","","","","","","","",//#44
"_qD","_qP",//#45, #46
"","","","","","","","","","","","","","","","","","","","","","",//#68
"","","","","","","","","","","","","","","","","","","","","","",//#90
"","","","","","","","","","","","","","","","","","","","","","",//#112
"","","","","","","","","","","","","","","","","","","","","","",//#134
"","","","","","","","","","","","","","","","","","","","","","",//#156
"","","","","","",//162
"_yo",//#163
"","","","","","","","","","","","","","","",//#178
"_YO",//#179
"","","","","","","","","","","","",//#191
"_yu","_a", "_b","_c","_d","_e","_f","_g","_x","_i","_y","_k","_l","_m",
"_n","_o","_p","_ya","_r","_s","_t","_u","_zh","_v","_er","_y","_z","_sh",
"_ye","_sch","_ch","_er","_YU","_A","_B","_C","_D","_E","_F","_G","_X","_I",
"_Y","_K","_L","_M","_N","_O","_P","_YA","_R","_S","_T","_U","_ZH","_V",
"_ER","_Y","_Z","_SH","_YE","_SCH","_CH","_ER");
...
for i:=0 to length(ElementParams)-1 do
with ElementParams[i] do
for k:=0 to Length(ID) do
begin
s:=ID;
if Ord(ID[k]) in [45,46,163,179,192..255] then s[k]:=RTDBChar[Ord(ID[k])];
ID:=s;
end;
← →
СатирЪ © (2004-08-02 17:48) [4]
> s[k]:=RTDBChar[Ord(ID[k])];
ошибочка, несовместимость типов Char и Shortstring...
← →
Anatoly Podgoretsky © (2004-08-02 17:49) [5]СатирЪ © (02.08.04 17:45) [3]
Именно так, только индекс стоит сделать не численный, а символьный. Тогда будет выглядеть так
s1 := RTDBCodec[s[i]]
← →
Igorek © (2004-08-02 20:03) [6]
> СатирЪ © (02.08.04 17:45) [3]
Недостаток в том, что память пустует. Лучше сделай иначе, в ущерб скорости.
У тебя есть несколько диапазонов значений символа. Надо просто написать функцию конвертации кода символа в номер ячейки и наоборот. Для начала для каждого диапазона найти смещение.
По формуле:индекс = код символа - смещение диапазона в котором он находится
можно написать обе функции.
Такое решение неплохо когда диапазонов немного и между ними большие разрывы
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c