Главная страница
    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.037 c
1-1091978593
Mbox
2004-08-08 19:23
2004.08.22
TDirectoryOutLine


1-1091708352
Coder: TCoder;
2004-08-05 16:19
2004.08.22
"..." (переменное число параметров)


1-1092090365
mouse_web
2004-08-10 02:26
2004.08.22
Заставка перед загрузкой программы


14-1091768274
WondeRu
2004-08-06 08:57
2004.08.22
Кто использует в своих программах HASP ы?


14-1091621952
ArMellon
2004-08-04 16:19
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский