Главная страница
    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.47 MB
Время: 0.028 c
14-1091785039
Cerberus
2004-08-06 13:37
2004.08.22
Текстовые фаилы


3-1090987909
Ani
2004-07-28 08:11
2004.08.22
Как передать содержимое QuickRep в MsWord?


14-1091715614
MacroDenS
2004-08-05 18:20
2004.08.22
Кто нибудь может объяснить????


10-1029755420
Condor_av
2002-08-19 15:10
2004.08.22
Несколько вопросов по idl2pas & Corba


3-1090927751
Экспериментатор
2004-07-27 15:29
2004.08.22
Как правильно сортировать?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский