Главная страница
    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.034 c
1-1091753019
ASoft
2004-08-06 04:43
2004.08.22
Переменная по STEPу


3-1089268594
Григорьев Антон
2004-07-08 10:36
2004.08.22
БД без СУБД


4-1089385781
Ivolg
2004-07-09 19:09
2004.08.22
Перехват


14-1091449022
Ven
2004-08-02 16:17
2004.08.22
Запуск DOS-овской программы под WinXP


1-1091599431
*Pavel
2004-08-04 10:03
2004.08.22
Печать TImage





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский