Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Перекодировщик   Найти похожие ветки 

 
СатирЪ ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.043 c
1-1091763515
kos
2004-08-06 07:38
2004.08.22
Как конвертировать значение даты в целое число?


14-1091175002
ОлегЪ
2004-07-30 12:10
2004.08.22
Помогите плиз!


3-1091101972
SergP
2004-07-29 15:52
2004.08.22
Проблема с запросом...(LEFT JOIN)


6-1087284001
HydraMarat
2004-06-15 11:20
2004.08.22
TIdTCPServer vs TTcpServer


11-1077964306
nsvi
2004-02-28 13:31
2004.08.22
Проблемы с KOLWebBrowser