Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.033 c
1-1092048772
}|{yk
2004-08-09 14:52
2004.08.22
AV при Destroy


3-1091013683
Klerk
2004-07-28 15:21
2004.08.22
Доступ к FireBird


1-1091900535
Александр22
2004-08-07 21:42
2004.08.22
TDateTimePicker


14-1091553860
DDA
2004-08-03 21:24
2004.08.22
jmp +$06


4-1089291960
дурень
2004-07-08 17:06
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский