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

Вниз

Несовместимость String и Char   Найти похожие ветки 

 
TDionis   (2005-08-03 13:22) [0]

Никогда не занимался Char`ом. И вот, решил написать транслитор (ну, чтобы русский текст был английскими буквами). Вот код:

var
  S,now_bykva: string;
  Flags: TReplaceFlags;
  nom: integer;
  bykva: array["а".."я"]  of string;
begin
bykva["а"] := "a";
bykva["б"] := "b";
bykva["в"] := "v";
bykva["г"] := "g";
bykva["д"] := "d";
bykva["е"] := "e";
bykva["ж"] := "j";
bykva["з"] := "z";
bykva["и"] := "i";
bykva["й"] := "i";
bykva["к"] := "k";
bykva["л"] := "l";
bykva["м"] := "m";
bykva["н"] := "n";
bykva["о"] := "o";
bykva["п"] := "p";
bykva["р"] := "r";
bykva["с"] := "s";
bykva["т"] := "t";
bykva["у"] := "u";
bykva["ф"] := "ph";
bykva["х"] := "x";
bykva["ц"] := "z";
bykva["ч"] := "ch";
bykva["ш"] := "sh";
bykva["щ"] := "sh";
bykva["ъ"] := "";
bykva["ы"] := "i";
bykva["ь"] := "";
bykva["э"] := "e";
bykva["ю"] := "iy";
bykva["я"] := "ia";
  nom := 0;
  Flags:= [ rfReplaceAll, rfIgnoreCase ];
  S:= memo1.Text;
while nom < length(memo1.Text) do begin
  now_bykva := copy(s,nom,1);
  S:= StringReplace( S, now_bykva, bykva[copy(s,nom,1)], Flags);      
  nom := nom + 1;
end;
  memo1.Text := s;

Тут вылезает ошибка, что bykva[copy(s,nom,1)] ему не ндравися, и что я раздолбай хочу ему подсунуть в индекс string.

Отсюда вопрос: надо либо как-то перевести string в Char либо может  найти аналог Copy но в char...


 
Чапаев ©   (2005-08-03 13:24) [1]

bykva[copy(s,nom,1)[1]]


 
Думкин ©   (2005-08-03 13:26) [2]

ДОСТУП К БУКВЕ В СТРИНГЕ - КАК В МАССИВЕ.

Оп, капс не вырубил. Звиняюсь.


 
TDionis   (2005-08-03 13:28) [3]

Сорри за мега тупой вопрос: что в данном случае означает bykva[copy(s,nom,1)[1]] ??


 
DiamondShark ©   (2005-08-03 13:29) [4]

Это означает первый символ в строке, возвращаемой функцией copy


 
TDionis   (2005-08-03 13:29) [5]

ага но вылетает с ошибкой. почему?


 
TDionis   (2005-08-03 13:30) [6]

Хм.. а что, в стринге отсчет идет с 1 а не с нуля ?


 
Digitman ©   (2005-08-03 13:32) [7]


> Хм.. а что, в стринге отсчет идет с 1 а не с нуля ?


здрасть-приехали !

конечно с 1 !


 
Ega23 ©   (2005-08-03 13:33) [8]

2 TDionis   (03.08.05 13:30) [6]
Хм.. а что, в стринге отсчет идет с 1 а не с нуля ?

Есть мнение, что кое-кому не мешает почитать про тип String и Char, прежде чем вопросы задавать, нес па?


 
TDionis   (2005-08-03 13:35) [9]

ага

Вопрос в том почему больше 1 буквы вылетает EAccessViolation


 
Думкин ©   (2005-08-03 13:39) [10]

> [9] TDionis   (03.08.05 13:35)

1. ты бы моим воспользовался s[nom]
2. А как больше 1 если у тебя строка получается с одним символом?
3. Читать основы Паскаля. А то при таком темпе, следующей твоей программой будет DOOM4 не меньше. А вопросы уровня "в трей".


 
Digitman ©   (2005-08-03 13:39) [11]


> почему больше 1 буквы вылетает


потому что все то что больше 1 буквы любит летать


 
Ega23 ©   (2005-08-03 14:10) [12]


procedure TForm1.Button2Click(Sender: TObject);
const
Liters:array[224..255] of string=("a", "b", "v", "g", "d", "e", "j", "z", "i", "i",
                               "k", "l", "m", "n", "o", "p", "r", "s", "t", "u",
                               "ph", "x", "z", "ch", "sh", "sh", "", "i", "",
                               "e", "iy", "ya" );
var
i:Integer;
 res:string;

begin
res:="";
Edit1.Text:=AnsiLowerCase(Edit1.Text);

for i:=1 to Length(Edit1.Text) do
 begin
  res:=res+Liters[Ord(Edit1.Text[i])];
 end;
Label1.Caption:=res;

end;


 
evvcom ©   (2005-08-03 14:26) [13]


> array[224..255]

лучше тогда array[Ord("а")..Ord("я")] нагляднее.

> for i:=1 to Length(Edit1.Text) do
>  begin
>   res:=res+Liters[Ord(Edit1.Text[i])];
>  end;

+ проверку на принадлежность символа в Edit1 диапазону от а до я


 
Ega23 ©   (2005-08-03 14:28) [14]

Не, ну это пусть сам уже думает и делает. Я идею подкинул?  :о)


 
TDionis   (2005-08-03 14:29) [15]

Спасибо теперь только большие буквы надо проработать


 
Ega23 ©   (2005-08-03 14:31) [16]

Спасибо теперь только большие буквы надо проработать

Не вопрос!


procedure TForm1.Button2Click(Sender: TObject);
const
Liters:array[224..255] of string=("a", "b", "v", "g", "d", "e", "j", "z", "i", "i",
                              "k", "l", "m", "n", "o", "p", "r", "s", "t", "u",
                              "ph", "x", "z", "ch", "sh", "sh", "", "i", "",
                              "e", "iy", "ya" );
var
i:Integer;
res:string;

begin
res:="";
Edit1.Text:=AnsiUpperCase(Edit1.Text);

for i:=1 to Length(Edit1.Text) do
begin
 res:=res+ANSIUpperCase(Liters[Ord(Edit1.Text[i])]);
end;
Label1.Caption:=res;

end;


:-)))))))))))))))


 
Ega23 ©   (2005-08-03 14:33) [17]

2 Ega23 ©   (03.08.05 14:31) [16]

Не, фигу... Так не получится...


 
TDionis   (2005-08-03 16:11) [18]

ну ладно, идем по варварский:

AnsiLowerCase(edit1.Text[i]) = edit1.Text[i] - значит число маленькое. ))

а на самомо деле проще проработать 192 - 224 элементы массива

вобщем всем спасибо за помощь


 
begin...end ©   (2005-08-03 17:35) [19]

> evvcom ©   (03.08.05 14:26) [13]
> лучше тогда array[Ord("а")..Ord("я")] нагляднее.

array["а".."я"]. Ещё нагляднее.
:-)



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
1-1122889264
sCORpio80
2005-08-01 13:41
2005.08.21
Вернуть параметр из MDI-Child


14-1122840778
Cerberus
2005-08-01 00:12
2005.08.21
Поиск


14-1122483433
Димаска
2005-07-27 20:57
2005.08.21
IRC в E-Mule


1-1122987824
webpauk
2005-08-02 17:03
2005.08.21
Иконка из Hinstance


4-1120126541
BiN
2005-06-30 14:15
2005.08.21
Прототип IoVolumeDeviceToDosName в user-mode.